社区
图形处理/算法
帖子详情
快来抢分!!! 如何保存bmp文件
Swallowdeng_cq
2004-04-30 10:43:19
已经有了256色调色板的值、像素的值、图片宽高。如何把它写入文件。我知道是要写个bmp文件头不过手头没资料。会的就请把原码贴出来,谢谢!
...全文
174
8
打赏
收藏
快来抢分!!! 如何保存bmp文件
已经有了256色调色板的值、像素的值、图片宽高。如何把它写入文件。我知道是要写个bmp文件头不过手头没资料。会的就请把原码贴出来,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Swallowdeng_cq
2004-04-30
打赏
举报
回复
Sorry 我已经解决了,先写入一个文件头和文件信息头还有调色板数组,最后是图形 数据。 lijin6249(lijin6249) 你的没法应付256色的bmp
代码医生
2004-04-30
打赏
举报
回复
这是我找的代码
如果具有一个设备无关的位图句柄,把一个位图写入BMP文件非常简单:在位图内容之后写入BITMAPINFOHEADER信息即可。需要设置BITMAPINFOHEADER的三个成员是bfType,其值为"BM",bfSize,其值是位图的大小,以及,bfOffBits,其值为文件开始到位图位的偏移量。
// WriteDIB - Writes a DIB to file
// Returns - TRUE on success
// szFile - Name of file to write to
// hDIB - Handle of the DIB
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;
trcd2000
2004-04-30
打赏
举报
回复
没有人回啊,唉跟我一样(我的问题也每人回),还是自己找资料吧
Swallowdeng_cq
2004-04-30
打赏
举报
回复
up
Swallowdeng_cq
2004-04-30
打赏
举报
回复
swbreath(雪白呼嘘) you are right
swbreath
2004-04-30
打赏
举报
回复
一般都是转换成特定的DIB后存储的
swbreath
2004-04-30
打赏
举报
回复
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1) wBitCount = 1;
else if (iBits <= 4) wBitCount = 4;
else if (iBits <= 8) wBitCount = 8;
else wBitCount = 24;
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE) return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}
goldpony
2004-04-30
打赏
举报
回复
up
C++ 读取raw
文件
并
保存
为到
bmp
图片下
上篇文章,写了如何读取光谱图片raw,本文就解决,如何把
保存
的像素值
保存
为
BMP
图片格式。 关于
bmp
文件
格式,网上有很多,不再赘述。我们需要做的只是修改相关信息头,然后填充数据就可以了,本代码实现的是24真彩色显示,即不带调色板,R,G,B三个分量都显示同一波段的像素值。这个可以得到一个波段的图像。调整相关系数,就可以得到16个波段的图像。做这个,主要还是为了以后图像处理可以更方便的看到
RGB数据
保存
为
BMP
图片
一、
BMP
文件
由
文件
头、位图信息头、颜色信息和图形数据四部分组成。 1、
BMP
文件
头(14字节) [cpp] view plain copy typedef struct /****
BMP
file header structure ****/ { unsigned int
将HDC
保存
为
BMP
文件
将HDC
保存
为
BMP
文件
BMP
文件
的读取和
保存
BMP
文件
结构分析和读取
保存
如何将位图对象
保存
为
BMP
文件
GDI中位图对象是很常见的GDI对象,但是无论是SDK,还是MFC都没有提供现在的函数或是方法来将一个位图对象
保存
为一个
BMP
文件
,这里介绍一下
保存
方法。位图
文件
格式:DIB
文件
有四个主要部分:
文件
表头(BITMAPFILEHEADER)信息表头 (BITMAPINFOHEADER)调色板(不一定有) 位图图素位而一个位图对象和上述唯一不同在于它没有
文件
表头。
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章