读书人

怎样用API写位图文件解决思路

发布时间: 2012-03-30 17:32:09 作者: rapoo

怎样用API写位图文件
我可以用API的LoadImage函数读取.bmp的图片文件并提取其像素数组进行处理
但是处理好之后我怎样.bmp的文件啊?
处理好的图像我存在HBITMAP类型的变量中。
求大侠指导!

[解决办法]

C/C++ code
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;    }}
[解决办法]
了解Bitmap图像格式后,跟写普通的文件没有什么区别.
如果楼主想真正弄懂,那必须要学习学习Bitmap图像格式,其实也挺简单的.

读书人网 >C++

热点推荐