求8bit灰度图文件生成代码

zobin 2008-05-31 11:24:30
图中的颜色数据已经取得
在OnDraw里可以表示出来
red = bmp[i*width+j];
green = bmp[i*width+j];
blue = bmp[i*width+j];
pDC->SetPixel(j-1,i,RGB(red,green,blue));
但不知道怎么用颜色数据生成文件(要直接生成文件)
求大侠给出完整源代码
...全文
69 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
thirtyking 2008-05-31
  • 打赏
  • 举报
回复

static DWORD _CalWidthBytes(DWORD bits)
{
return ((((bits) + 31) & (~31)) >> 3);
}
//pFileName 是文件名,pBuf是要存成BMP图的数据,width,height是宽和高,
//只能存8bit的BMP图
BOOL _BmpSave(LPCSTR pFileName, BYTE * pBuf, LONG width, LONG height)
{
BITMAPFILEHEADER bmpFileHeader, *pBmpFileHeader;
BITMAPINFOHEADER bmpInfoHeader, *pBmpInfoHeader;
RGBQUAD color[256], *pColor;
BYTE * pData;
FILE * savedFile;
INT i;

pBmpFileHeader = &bmpFileHeader;
pBmpInfoHeader = &bmpInfoHeader;
pColor = color;

bmpFileHeader.bfType = 0x4d42;
bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256
+ _CalWidthBytes(8 * width) * height;
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
bmpFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;

bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHeader.biWidth = width;
bmpInfoHeader.biHeight = height;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biBitCount = 8;
bmpInfoHeader.biCompression = 0;
bmpInfoHeader.biSizeImage = _CalWidthBytes(8 * width) * height;
bmpInfoHeader.biXPelsPerMeter = 0;
bmpInfoHeader.biYPelsPerMeter = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biClrImportant = 0;

for (i = 0; i < 256; i++)
{
color[i].rgbBlue = i;
color[i].rgbGreen = i;
color[i].rgbRed = i;
color[i].rgbReserved = 0;
}

pData =(BYTE*)MemAlloc(sizeof(BYTE) * _CalWidthBytes(8 * width) * height);
if (NULL == pData) return FALSE;
for (i = 0; i < height; i++)
{
memcpy(pData + i * _CalWidthBytes(8 * width), pBuf + (height -1 - i) * width, width);
}

savedFile = fopen(pFileName, "wb");
if (NULL == savedFile) return FALSE;
fwrite(pBmpFileHeader, sizeof(BITMAPFILEHEADER), 1, savedFile);
fwrite(pBmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, savedFile);
fwrite(pColor, sizeof(RGBQUAD), 256, savedFile);
fwrite(pData, sizeof(BYTE), _CalWidthBytes(8 * width) * height, savedFile);
if (0 != fclose(savedFile)) return FALSE;

MemFree(pData);
return TRUE;
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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