//get dib handle,then write into file
//write DIB into File
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi; if (!hDIB)
return FALSE; CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE; lpbi = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << lpbi->biBitCount; // Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +
nColors * sizeof(RGBQUAD)); // Write the file header
file.Write( &hdr, sizeof(hdr) ); // Write the DIB header and the bits
file.Write( lpbi, GlobalSize(hDIB) ); return TRUE;
}
//write DIB into File
BOOL WriteDIB( LPTSTR szFile, HANDLE hDIB)
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi; if (!hDIB)
return FALSE; CFile file;
if( !file.Open( szFile, CFile::modeWrite|CFile::modeCreate) )
return FALSE; lpbi = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << lpbi->biBitCount; // Fill in the fields of the file header
hdr.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM"
hdr.bfSize = GlobalSize (hDIB) + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof( hdr ) + lpbi->biSize +
nColors * sizeof(RGBQUAD)); // Write the file header
file.Write( &hdr, sizeof(hdr) ); // Write the DIB header and the bits
file.Write( lpbi, GlobalSize(hDIB) ); return TRUE;
}
解决方案 »
- 请教:如何将像素数据绘制出来???
- 单选按钮的问题:一组单选按钮控制另一组单选按钮的有效状态
- 读取数据的简单问题。。。
- 一个wtl问题
- 我的MDI程序在启动的时候通过OnFileNew()创建了三个文档。我是想在文档对应的视图中绘图,比如在文档1对应的视图中画圆,在文档2对应的视图中画矩形.但是我不知道在OnDraw()函数中如何添加代码来实现。因为我在OnDraw()函数中添加了画圆的程
- 为什么BMP显示不出来?
- 一个应用程序就是一个进程吗?
- 什么意思?
- 在stdafx.h中加入#define UNICODE和#define _UNICODE就链接不了工程
- 那位高手能够告诉我用什么方法可以修改对话框上按钮的显示不可显示状态.
- 关于CRecordset中字段名大小写的问题,急!
- 关于工具栏的小问题
怎么得到dib handle呀?
bitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"d:\\1.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
假设你有CBitmap bmp;
HBITMAP hBmp = (HBITMAP)bmp;
{
// 如果本身类中原来没有位图,函数返回NULL
if (!IsValid())
return NULL; ASSERT(m_pInfo); // DIB内部形式尺寸(dibsize)
DWORD infosize = CalculateDIBInfoSize((LPBITMAPINFOHEADER)m_pInfo);
DWORD dibsize = CalculateDIBSize((LPBITMAPINFOHEADER)m_pInfo); // 创建DIB内存块,带GMEM_DDESHARE标识可以使该句柄用于剪贴板
HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, dibsize);
if (!h)
return NULL; LPSTR lp = (LPSTR)::GlobalLock(h);
if (lp)
{
// 拷入DIB信息
::memcpy((void *)lp, (const void *)m_pInfo, (size_t)infosize); // 获取DIB位数据
HWND hWnd = ::GetDesktopWindow();
ASSERT(hWnd);
HDC hDC = ::GetDC(hWnd);
if (!::GetDIBits(hDC,(HBITMAP)m_hObject,0,m_pInfo->bmiHeader.biHeight,\
(LPVOID)((DWORD)lp+infosize),(LPBITMAPINFO)lp,DIB_RGB_COLORS))
{
::GlobalUnlock(h);
::GlobalFree(h);
::ReleaseDC(hWnd, hDC);
return NULL;
}
::ReleaseDC(hWnd, hDC);
::GlobalUnlock(h); return h; // 成功
} ::GlobalFree(h); return NULL;
}