[英]I need to create monocrome .bmp signature file by using C++ code but not able to create
我需要使用 C++ 代码创建 monocrome .bmp 签名文件,但无法创建。 下面是代码片段。
bool SaveBMP ( BYTE* Buffer, int width, int height, long paddedsize, LPCTSTR bmpfile )
{
// declare bmp structures
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER info;
// andinitialize them to zero
memset ( &bmfh, 0, sizeof (BITMAPFILEHEADER ) );
memset ( &info, 0, sizeof (BITMAPINFOHEADER ) );
// fill the fileheader with data
bmfh.bfType = 0x4d42; // 0x4d42 = 'BM'
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + paddedsize;
bmfh.bfOffBits = 0x36; // number of bytes to start of bitmap bits
// fill the infoheader
info.biSize = sizeof(BITMAPINFOHEADER);
info.biWidth = width;
info.biHeight = height;
info.biPlanes = 1; // we only have one bitplane
info.biBitCount = 1; // RGB mode is 24 bits
info.biCompression = BI_RGB;
info.biSizeImage = 0; // can be 0 for 24 bit images
info.biXPelsPerMeter = 0x0ec4; // paint and PSP use this values
info.biYPelsPerMeter = 0x0ec4;
info.biClrUsed = 0; // we are in RGB mode and have no palette
info.biClrImportant = 0; // all colors are important
// now we open the file to write to
HANDLE file = CreateFile ( bmpfile , GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if ( file == NULL )
{
CloseHandle ( file );
return false;
}
// write file header
unsigned long bwritten;
if ( WriteFile ( file, &bmfh, sizeof ( BITMAPFILEHEADER ), &bwritten, NULL ) == false )
{
CloseHandle ( file );
return false;
}
// write infoheader
if ( WriteFile ( file, &info, sizeof ( BITMAPINFOHEADER ), &bwritten, NULL ) == false )
{
CloseHandle ( file );
return false;
}
// write image data
if ( WriteFile ( file, Buffer, paddedsize, &bwritten, NULL ) == false )
{
CloseHandle ( file );
return false;
}
// and close file
CloseHandle ( file );
return true;
}
**//当我运行这段代码时,创建的位图文件是空白的,没有显示签名,只能显示签名文件的背景。 **
单色位图需要调色板。 在这种情况下,调色板大小为 8 个字节(2 个RGBQUAD
值)
这额外的 8 个字节应该添加到BITMAPFILEHEADER
文件大小。
在BITMAPFILEHEADER
之后,您正在使用不包含调色板信息的BITMAPINFOHEADER
。 您必须直接使用BITMAPINFO
而不是BITMAPINFOHEADER
BITMAPINFO* bmpinfo = (BITMAPINFO*)malloc(palette_size + sizeof(BITMAPINFOHEADER));
bmpinfo->bmiHeader = { sizeof(BITMAPINFOHEADER),
width, height, 1, bitcount, BI_RGB, 0, 0, 0, 0, 0 };
如果没有为单色位图检索Buffer
,那么您不能简单地更改此保存功能中的位bitcount
并期望一切正常。
if ( file == NULL )// <-error
{
CloseHandle ( file );
return false;
}
如果CreateFile
失败,则返回值为INVALID_HANDLE_VALUE
。 您可以从 API 函数的在线文档中找到这些值。 修正后的版本应该是
if(file != INVALID_HANDLE_VALUE)
{
unsigned long bwritten;
WriteFile(file, &bmfh, sizeof(BITMAPFILEHEADER), &bwritten, NULL);
WriteFile(file, bmpinfo, 8 + sizeof(BITMAPINFOHEADER), &bwritten, NULL);
WriteFile(file, Buffer, paddedsize, &bwritten, NULL);
CloseHandle(file);
return true;
}
return false;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.