对BMP文件进行增高并写字时总是失败
目的:
对BMP图片的底部增加高度,然后在新增加的区域写字,然后再保存成新的BMP图片。
做法:
根据原始的图片数据创建位图句柄,然后把它显示到内存的DC上,在适当的位置写字(TextOut),然后再获取此DC上的图像数据,接着把此数据保存成为新的BMP图片
限制:
由于这些图片的数据是通过解码视频数据得到的,所以没有所谓的BMP文件头等信息
条件:
纯粹的24位RGB数据
先看代码如下:
此函数的几个参数介绍:
FileName:[in],修改后的BMP图片要保存成的文件名
RGBData:[in],原始的BMP图片数据,24位的,不包括文件头等信息,只是纯粹的颜色数据
RGBDataSize:[in],原始数据的长度,单位为字节
width,height:[in],原始图片的宽度和高度,它们的成绩再乘以3应该和RGBDataSize相等
在测试的时候发现总是不对,之前有试过有文件头的就没有问题(只是在拷贝RGBData数据时把文件头去掉,另外在写图片信息时只是更改了和高度有关的信息),但现在总是不对!
请各位大虾帮助
对BMP图片的底部增加高度,然后在新增加的区域写字,然后再保存成新的BMP图片。
做法:
根据原始的图片数据创建位图句柄,然后把它显示到内存的DC上,在适当的位置写字(TextOut),然后再获取此DC上的图像数据,接着把此数据保存成为新的BMP图片
限制:
由于这些图片的数据是通过解码视频数据得到的,所以没有所谓的BMP文件头等信息
条件:
纯粹的24位RGB数据
先看代码如下:
BOOL Save2BMPFile(char* FileName, char *RGBData, int RGBDataSize, int width, int height)
{
char *pszTmp = NULL;
char *pTmp = NULL;
HDC dc = CreateDC( TEXT("DISPLAY"), NULL, NULL, NULL );
HDC dc2 = CreateCompatibleDC( dc );
int iCountLine = 1;
long lLineHeight = 20;
long lWidthBytes, lNewHeight;
if(width%4 == 0)
lWidthBytes = width * 3;
else
lWidthBytes = (width+(4-width%4)) * 3;
lNewHeight = height+(iCountLine*lLineHeight);
// 创建新大小的图片内存
pszTmp = new char[lWidthBytes * lNewHeight];
memset( pszTmp, 120,lWidthBytes * lNewHeight);
memcpy(pszTmp + (lWidthBytes * iCountLine*lLineHeight),RGBData,lWidthBytes * height);
pTmp = new char[lWidthBytes];
int l;
for ( l = 0; l < lNewHeight / 2; l++ )
{
memcpy( pTmp, pszTmp + lWidthBytes * l, lWidthBytes );
memcpy( pszTmp + lWidthBytes * l, pszTmp + lWidthBytes * (lNewHeight - 1 - l), lWidthBytes );
memcpy( pszTmp + lWidthBytes * (lNewHeight - 1 - l), pTmp, lWidthBytes );
}
HBITMAP hBitmap = CreateBitmap( width, lNewHeight, 1, 24, pszTmp );
SelectObject( dc2, hBitmap );
l = 0;
TextOut( dc2,5,height, "abc", 3 ); // 在新增加的调试上写个
HBITMAP retBitMap = (HBITMAP)GetCurrentObject(dc2,OBJ_BITMAP);
long lGet = GetBitmapBits(retBitMap,lWidthBytes * lNewHeight,pszTmp);
for ( l = 0; l < lNewHeight / 2; l++ )
{
memcpy( pTmp, pszTmp + lWidthBytes * l, lWidthBytes );
memcpy( pszTmp + lWidthBytes * l, pszTmp + lWidthBytes * (lNewHeight - 1 - l), lWidthBytes );
memcpy( pszTmp + lWidthBytes * (lNewHeight - 1 - l), pTmp, lWidthBytes );
}
// 保存为文件
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bmiHdr;
ZeroMemory( &bmfHdr, sizeof( bmfHdr ) );
ZeroMemory( &bmiHdr, sizeof( bmiHdr ) );
bmiHdr.biSize = sizeof(BITMAPINFOHEADER);
bmiHdr.biWidth = width;
bmiHdr.biHeight = lNewHeight;
bmiHdr.biPlanes = 1;
bmiHdr.biBitCount = 24;
bmiHdr.biCompression = BI_RGB;
bmiHdr.biSizeImage = 0;
bmiHdr.biXPelsPerMeter = 0;
bmiHdr.biYPelsPerMeter = 0;
bmiHdr.biClrUsed = 0;
bmiHdr.biClrImportant = 0;
bmfHdr.bfType = ((WORD) ('M' << 8) | 'B');
bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + lWidthBytes*lNewHeight);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
FILE *fp;
fp = fopen(FileName,"w+b");
if(fp != NULL)
{
fwrite((LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), 1, fp);
fwrite((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER), 1, fp);
int size = lWidthBytes*lNewHeight;
fwrite( pszTmp, lWidthBytes*lNewHeight,1, fp );
fclose(fp);
return TRUE;
}
return FALSE;
}
此函数的几个参数介绍:
FileName:[in],修改后的BMP图片要保存成的文件名
RGBData:[in],原始的BMP图片数据,24位的,不包括文件头等信息,只是纯粹的颜色数据
RGBDataSize:[in],原始数据的长度,单位为字节
width,height:[in],原始图片的宽度和高度,它们的成绩再乘以3应该和RGBDataSize相等
在测试的时候发现总是不对,之前有试过有文件头的就没有问题(只是在拷贝RGBData数据时把文件头去掉,另外在写图片信息时只是更改了和高度有关的信息),但现在总是不对!
请各位大虾帮助
...全文
相关推荐
mfc打开并显示BMP图片
创建一个`CFile`对象,并使用`Open`函数打开BMP文件。记得提供正确的文件路径,通常是从资源文件或用户指定的路径获取。2.
从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束.
最后,我们使用 `fclose` 函数关闭文件,以释放系统资源。错误处理在本程序中,我们需要处理文件打开失败的错误情况。如果文件打开失败,我们将打印一个错误信息,并退出程序。
bmp转gcode
在将BMP转换为Gcode时,软件会分析图像的每个像素,并将其映射为一系列的Gcode行,以形成连续的路径。像素的颜色和亮度可以被映射为不同的Z轴高度,或者在3D打印中决定材料沉积的量。"
BMP文件的读取程序
在VS2008环境下,你需要确保项目设置为MFC应用程序,并包含afxwin.h头文件来使用MFC库。同时,记得在代码中添加适当的错误处理,如文件读取失败、内存分配失败等情况。
Android4.0下使用framebuffer抓屏并保存成bmp文件
下面我们将详细讨论如何在Android 4.0下使用framebuffer抓屏并保存为BMP文件。


界面
