怎样用API写位图文件

wsdhren 2011-12-11 07:59:37
我可以用API的LoadImage函数读取.bmp的图片文件并提取其像素数组进行处理
但是处理好之后我怎样.bmp的文件啊?
处理好的图像我存在HBITMAP类型的变量中。
求大侠指导!
...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2011-12-12
  • 打赏
  • 举报
回复
了解Bitmap图像格式后,跟写普通的文件没有什么区别.
如果楼主想真正弄懂,那必须要学习学习Bitmap图像格式,其实也挺简单的.
「已注销」 2011-12-12
  • 打赏
  • 举报
回复
1楼高手,我是来膜拜的
maoxing63570 2011-12-11
  • 打赏
  • 举报
回复

void ScreenCapture(int bitCount,bool isDrawCursor)
{
int color_num = bitCount <= 8 ? 1 << bitCount : 0;
int nBISize = sizeof(BITMAPINFOHEADER) + (color_num * sizeof(RGBQUAD));
BITMAPINFO *lpbmi = (BITMAPINFO *) new BYTE[nBISize];
int nWidth=GetSystemMetrics(SM_CXSCREEN);
int nHeight=GetSystemMetrics(SM_CYSCREEN);
BITMAPINFOHEADER *lpbmih = &(lpbmi->bmiHeader);
lpbmih->biSize = sizeof(BITMAPINFOHEADER);
lpbmih->biWidth = nWidth;
lpbmih->biHeight = nHeight;
lpbmih->biPlanes = 1;
lpbmih->biBitCount = bitCount;
lpbmih->biCompression = BI_RGB;
lpbmih->biXPelsPerMeter = 0;
lpbmih->biYPelsPerMeter = 0;
lpbmih->biClrUsed = 0;
lpbmih->biClrImportant = 0;
lpbmih->biSizeImage = (((lpbmih->biWidth * lpbmih->biBitCount + 31) & ~31) >> 3) * lpbmih->biHeight;

HDC hDC = GetDC(NULL);
HDC hMemDC=CreateCompatibleDC(hDC);
HBITMAP hBmp = CreateCompatibleBitmap(hMemDC, 1, 1); // 高宽不能为0

GetDIBits(hMemDC, hBmp, 0, 0, NULL, lpbmi, DIB_RGB_COLORS);
LPBYTE m_lpvFullBits=NULL;
HPALETTE hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE ); //得到系统默认调色板
hPal = SelectPalette(hMemDC,hPal,FALSE);
HBITMAP lpbitmap=CreateDIBSection(hMemDC, lpbmi, DIB_RGB_COLORS, (void**)&m_lpvFullBits, NULL, NULL);
HGDIOBJ hOldObject=SelectObject(hMemDC,(HGDIOBJ)lpbitmap);
BitBlt(hMemDC,0,0,nWidth,nHeight,hDC,0,0,SRCCOPY);

if(isDrawCursor)
{
POINT pt;
ICONINFO iconinfo;
GetCursorPos(&pt);
HCURSOR hIcon=GetCursor();
if(GetIconInfo(hIcon,&iconinfo))
{
pt.x-=iconinfo.xHotspot;
pt.y-=iconinfo.yHotspot;
if(iconinfo.hbmColor!=NULL)
DeleteObject(iconinfo.hbmColor);

if(iconinfo.hbmMask!=NULL)
DeleteObject(iconinfo.hbmMask);
}
DrawIconEx(hMemDC,pt.x,pt.y,hIcon,0,0,0,NULL,DI_NORMAL | DI_COMPAT);
}

BITMAPFILEHEADER bh;
ZeroMemory(&bh,sizeof(bh));
bh.bfOffBits=sizeof(BITMAPFILEHEADER)+nBISize;
bh.bfSize=bh.bfOffBits+lpbmih->biSizeImage;
bh.bfType=0x4d42;
HANDLE hFile=INVALID_HANDLE_VALUE;
__try
{
HANDLE hFile=CreateFile(L"Desktop.bmp",GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

DWORD dwBytesWritten=0;
if(!WriteFile(hFile,&bh,sizeof(bh),&dwBytesWritten,NULL))
__leave;

if(!WriteFile(hFile,lpbmi,nBISize,&dwBytesWritten,NULL))
__leave;

if(!WriteFile(hFile,m_lpvFullBits,lpbmi->bmiHeader.biSizeImage,&dwBytesWritten,NULL))
__leave;
}
__finally
{
if(hFile!=INVALID_HANDLE_VALUE)
CloseHandle(hFile);

SelectObject(hMemDC,hOldObject);
DeleteDC(hMemDC);
ReleaseDC(NULL,hDC);
DeleteObject(lpbitmap);
DeleteObject(hBmp);
delete [] lpbmi;
}

}

给你个例子

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧