首页
社区
课程
招聘
[求助]怎样把hbitmap直接转为JPG?
发表于: 2009-4-20 16:37 9484

[求助]怎样把hbitmap直接转为JPG?

2009-4-20 16:37
9484
怎样把hbitmap直接转为JPG?

  我是采用的IJL库,现在把BMP文件转为JPG文件已经可以了,我想的是要从HBITMAP类型的内存中的图片直接保存为JPG,希望高手帮帮忙,谢谢!

  另,必须采用IJL哦!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一把,期盼高手来支持!
2009-4-20 18:18
0
雪    币: 272
活跃值: (143)
能力值: ( LV15,RANK:930 )
在线值:
发帖
回帖
粉丝
3
...
汗,看错了,不会 ijl...
只会用 CxImage ::CreateFromHBITMAP

原理应该一样的,使用 GetDIBits 拿到位图数据,然后在使用 ijl 编码..
2009-4-20 19:35
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
// 下面的函数只需传入hBitmap图像句柄,就可以取得图像数据到内存缓冲区中,取得内存图像数据后就可以使用ijl编码了。
// 注,返回的内存位图数据缓冲不用之后要用delete操作数删除缓冲,以免造成内存泄漏。
BYTE* CreateFromHBITMAP(HBITMAP hBitmap)
{
        HDC hdc=GetDC(NULL);
        HDC memdc=CreateCompatibleDC(hdc);
        SelectObject(memdc,hBitmap);
        BITMAP bm;
        GetObject(hBitmap,sizeof(BITMAP),&bm);
        BITMAPINFO bi;
        bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
        bi.bmiHeader.biWidth=bm.bmWidth;
        bi.bmiHeader.biHeight=bm.bmHeight;
        bi.bmiHeader.biPlanes=1;
        bi.bmiHeader.biBitCount=24;
        bi.bmiHeader.biCompression=BI_RGB;
        bi.bmiHeader.biSizeImage=0;
        bi.bmiHeader.biXPelsPerMeter=bm.bmWidth;
        bi.bmiHeader.biYPelsPerMeter=bm.bmHeight;
        bi.bmiHeader.biClrUsed=0;
        bi.bmiHeader.biClrImportant=0;
        int bitsize=bm.bmWidth*bm.bmHeight*3;
        BYTE* buff=new BYTE[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bitsize];
        BYTE* tmpbuff = buff;
        RtlZeroMemory(buff,sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bitsize);
        BITMAPFILEHEADER bf;
        bf.bfType=0x4d42;
        bf.bfSize=bitsize+14+sizeof(BITMAPINFOHEADER);
        bf.bfOffBits=sizeof(bi.bmiHeader)+sizeof(bf);
        bf.bfReserved1=0;
        bf.bfReserved2=0;
        RtlMoveMemory(tmpbuff,&bf,sizeof(BITMAPFILEHEADER));
        tmpbuff += sizeof(BITMAPFILEHEADER);
        RtlMoveMemory(tmpbuff,&bi,sizeof(BITMAPINFO));
        tmpbuff += sizeof(BITMAPINFO);
        GetDIBits(memdc,hBitmap,0,bm.bmHeight,tmpbuff,&bi,DIB_PAL_COLORS);  
        return buff;
}
2009-4-20 21:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
多谢楼上,我先试下,看来看雪就是比CSDN牛啊!
2009-4-21 09:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
晕,我搞了一上午,还是没搞定!

  楼上的兄弟,哪里能找到现成的代码我研究研究?
2009-4-21 12:06
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
// 下载了ijl库,看了看说明文档和例子程序而写下的例子。
#include <windows.h>
#include "ijl.h"  // 包含ijl.h文件,并在VC中设置包含入静态ijl15l.lib库或动态ijl15.lib库

// 将hBitmap图像转换成内存DIB数据图像。
BYTE* CreateFromHBITMAP(HBITMAP hBitmap)
{
        HDC hdc=GetDC(NULL);
        HDC memdc=CreateCompatibleDC(hdc);
        SelectObject(memdc,hBitmap);
        BITMAP bm;
        GetObject(hBitmap,sizeof(BITMAP),&bm);
        BITMAPINFO bi;
        bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
        bi.bmiHeader.biWidth=bm.bmWidth;
        bi.bmiHeader.biHeight=bm.bmHeight;
        bi.bmiHeader.biPlanes=1;
        bi.bmiHeader.biBitCount=24;
        bi.bmiHeader.biCompression=BI_RGB;
        bi.bmiHeader.biSizeImage=0;
        bi.bmiHeader.biXPelsPerMeter=bm.bmWidth;
        bi.bmiHeader.biYPelsPerMeter=bm.bmHeight;
        bi.bmiHeader.biClrUsed=0;
        bi.bmiHeader.biClrImportant=0;
        int bitsize=bm.bmWidth*bm.bmHeight*3;
        BYTE* buff=new BYTE[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bitsize];
        BYTE* tmpbuff = buff;
        RtlZeroMemory(buff,sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFO) + bitsize);
        BITMAPFILEHEADER bf;
        bf.bfType=0x4d42;
        bf.bfSize=bitsize+14+sizeof(BITMAPINFOHEADER);
        bf.bfOffBits=sizeof(bi.bmiHeader)+sizeof(bf);
        bf.bfReserved1=0;
        bf.bfReserved2=0;
        RtlMoveMemory(tmpbuff,&bf,sizeof(BITMAPFILEHEADER));
        tmpbuff += sizeof(BITMAPFILEHEADER);
        RtlMoveMemory(tmpbuff,&bi,sizeof(BITMAPINFO));
        tmpbuff += sizeof(BITMAPINFO);
        GetDIBits(memdc,hBitmap,0,bm.bmHeight,tmpbuff,&bi,DIB_PAL_COLORS);  
        DeleteObject(memdc);
        ReleaseDC(0,hdc);
        return buff;
}

int WINAPI WinMain(HINSTANCE hInstance,
                                   HINSTANCE hPrevInst,
                                   LPSTR lpCmdLine,
                                   int nShowCmd)
{
        BYTE* pBuff,*pJpgBuf;
        BITMAP bm;
        JPEG_CORE_PROPERTIES jcp;
        // 自己添加的测试用的图像
        HBITMAP hBitmap = LoadBitmap(GetModuleHandle(NULL),(char*)101);
        // 将hBitmap图像句柄转换成DIB图像
        pBuff = CreateFromHBITMAP(hBitmap);
        // 获取图像头信息
        GetObject(hBitmap,sizeof(BITMAP),&bm);
        // 初始化ijl库
        ijlInit(&jcp);
        // 初始化ijl JPEG_CORE_PROPERTIES结构
        jcp.DIBBytes = (UCHAR *)pBuff;
        jcp.DIBHeight = bm.bmHeight;
        jcp.DIBWidth = bm.bmWidth;
        jcp.DIBPadBytes = IJL_DIB_PAD_BYTES(jcp.DIBWidth,jcp.DIBChannels);
        // 新建一个保存转换后的jpg数据缓冲。
        pJpgBuf = new BYTE[jcp.DIBWidth * jcp.DIBHeight * 3 + sizeof(BITMAPINFO) + sizeof(BITMAPFILEHEADER)];
        // 数据缓冲清零初始化
        RtlZeroMemory(pJpgBuf,jcp.DIBWidth * jcp.DIBHeight * 3 + sizeof(BITMAPINFO) + sizeof(BITMAPFILEHEADER));
        // 继续初始化ijl JPEG_CORE_PROPERTIES结构
        jcp.JPGBytes = pJpgBuf;
        jcp.JPGHeight = bm.bmHeight;
        jcp.JPGWidth = bm.bmWidth;
        jcp.JPGSizeBytes = jcp.DIBWidth * jcp.DIBHeight * 3 + sizeof(BITMAPINFO) + sizeof(BITMAPFILEHEADER);
        // 将BMP DIB数据压缩成JPG数据
        ijlWrite(&jcp,IJL_JBUFF_WRITEWHOLEIMAGE);
        // 创造一个*.jpg文件
        HANDLE hFile=CreateFile("a.jpg",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
        DWORD num=0;
        SetFilePointer(hFile,0,NULL,0);
        // 写入JPG数据到*.jpg文件。
        WriteFile(hFile,pJpgBuf,jcp.JPGSizeBytes,&num,NULL);
        // 内存BMP DIB数据转换JPG成功,打扫清除对象操作
        MessageBox(0,"转换成功!","BMP转JPG",MB_OK);
        CloseHandle(hFile);
        ijlFree(&jcp);
        delete pBuff;
        delete pJpgBuf;
        return 0;
}
2009-4-21 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主,我不得不佩服你的这种精神!
2009-4-21 15:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
搞定,多谢大斑竹,多谢,在下给你磕头了!
2009-4-21 16:12
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谁有ijl15l.lib这个文件啊?不是ijl15.lib,发一个给我好吗?谢谢啦!fycyes@126.com
2009-7-26 19:02
0
游客
登录 | 注册 方可回帖
返回
//