当前位置:首页 > 芯闻号 > 充电吧
[导读]关于位图数据怎么4字节对齐:假如一张2*2的RGB图片如下:那么它在内存中数据理论应该为(图片数据在内存中是连续的,也就是说一行数据紧接着另一行数据,这里为了直观所以布局成这样)(0xFF 0x00

关于位图数据怎么4字节对齐:

假如一张2*2的RGB图片如下:

那么它在内存中数据理论应该为(图片数据在内存中是连续的,也就是说一行数据紧接着另一行数据,这里为了直观所以布局成这样)

(0xFF 0x00 0x00) (0x00 0xFF 0x00)

(0x00 0x00 0x00) (0xFF 0xFF 0xFF)

但是位图保存到磁盘时规定图片的数据每行的字节数要能被4整除(具体什么的我也不太清楚,对于我们一般人来说,我认为只要知道有这规定就行),对于上面的这张图片它每行数据为6个字节,显然6除以4还于2,显然没有4字节对齐,所以需要在每行数据后面补充2个字节的数据(随便值为多少,只要时2字节就行),因此补充后上图的数据变成:


(0xFF 0x00 0x00) (0x00 0xFF 0x00) (0x00 0x00)

(0x00 0x00 0x00) (0xFF 0xFF 0xFF)(0x00 0x00)

这样子的话将图片保存到磁盘中时就不会出现问题了。(不管图片每个像素是8字节 16字节 还是24字节都一样)


在实际中怎么操作呢,假如我们从摄像头中取出一张2*2的图片如下:


其数据在bitmapData 中,一共6个字节

当我们想要将它保存到磁盘中去时,我们可以调用下面这个函数simple_4ByteAlignment(2,2,bitmapData)(一些说明全在写在下面函数中。)

bool simple_4ByteAlignment(int width, int height, unsigned char * bitmapData)
{
	if (!bitmapData)
	{
		return false;
	}
	unsigned char * fData=0;
	//length 数据的总长度
	//fillCount 每行需要补充的字节数
	int length=0, fillCount=0;

	length = width*3;//这里乘3是因为我们图片为Rgb图片,每个像素占3个字节
	if (length % 4 != 0)//先计算补充字节后,数据的总字节数
	{
		fillCount = 4 - length % 4;
		length += fillCount;
	}
	length *=height;

	//分配相应长度的内存
	fData = (uchar*)malloc(length);

	if (!fData)
	{
		return false;
	}

	memset(fData, 0, length);

	for (size_t i = 0; i < height; i++)
	{
		//由于需要4字节对齐,所以需要对每行进行补充fillCount的字节的数据。
		memcpy(fData+(width*3+ fillCount )*i, bitmapData+width * 3*i, width * 3);
	}

	bool ret=WriteBitmap888ToFile("你要保存的图片的路径.bmp", width, height, (uchar*)fData, length);
	//释放内存  
	free(fData);
	return ret;
}


下面两个为保存图片为bmp格式的函数,一个保存图片为rgb888一个保存为rgb565。

//根据bitmapData的(RGB)数据,保存bitmap  
//filename是要保存到物理硬盘的文件名(包括路径)  
//dateSize 表示图形数据的大小
//bitmapData 数据必须经过4字节对齐
static BOOL WriteBitmap888ToFile(const char * filename, int width, int height, unsigned char * bitmapData, int dateSize)
{

	//填充BITMAPINFOHEADER  
	BITMAPINFOHEADER bitmapInfoHeader;
	memset(&bitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER));
	bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
	bitmapInfoHeader.biWidth = width;
	bitmapInfoHeader.biHeight = height;
	bitmapInfoHeader.biPlanes = 1;
	bitmapInfoHeader.biBitCount = 24;

	bitmapInfoHeader.biCompression = BI_RGB;

	bitmapInfoHeader.biSizeImage = dateSize;


	//填充BITMAPFILEHEADER  
	BITMAPFILEHEADER bitmapFileHeader;
	memset(&bitmapFileHeader, 0, sizeof(BITMAPFILEHEADER));
	bitmapFileHeader.bfType = 0x4d42;   //BM固定为这个
	bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
	bitmapFileHeader.bfSize = bitmapFileHeader.bfOffBits + dateSize;
	bitmapFileHeader.bfReserved1 = 0;
	bitmapFileHeader.bfReserved2 = 0;

	FILE * filePtr = 0;       

	fopen_s(&filePtr, filename, "wb");
	if (NULL == filePtr)
	{
		return FALSE;
	}

	fwrite(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);

	fwrite(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);

	fwrite(bitmapData, bitmapInfoHeader.biSizeImage, 1, filePtr);
	fclose(filePtr);
	return TRUE;
}

//根据bitmapData的(RGB)数据,保存bitmap  
//filename是要保存到物理硬盘的文件名(包括路径)  
//dateSize 表示图形数据的大小,
//bitmapData 数据必须经过4字节对齐
static BOOL WriteBitmap565ToFile(const char * filename, int width, int height, unsigned char * bitmapData, int dateSize)
{

	BITMAPFILEHEADER bitmapFileHeader;
	//填充BITMAPINFOHEADER  
	BITMAPINFOHEADER bitmapInfoHeader;

	RGBQUAD bmiColors[3]; //定义调色板

	bitmapFileHeader.bfType = 0x4d42;   //"BM"
	bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 3; 
	bitmapFileHeader.bfSize = bitmapFileHeader.bfOffBits + dateSize;
	bitmapFileHeader.bfReserved1 = 0;
	bitmapFileHeader.bfReserved2 = 0;


	memset(&bitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER));
	bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
	bitmapInfoHeader.biWidth = width;
	bitmapInfoHeader.biHeight = -height;
	bitmapInfoHeader.biPlanes = 1;
	bitmapInfoHeader.biBitCount = 16;
	bitmapInfoHeader.biCompression = BI_BITFIELDS;
	bitmapInfoHeader.biSizeImage = dateSize;


	bmiColors[0].rgbBlue = 0;
	bmiColors[0].rgbGreen = 0xF8;
	bmiColors[0].rgbRed = 0;
	bmiColors[0].rgbReserved = 0;

	bmiColors[1].rgbBlue = 0xE0;
	bmiColors[1].rgbGreen = 0x07;
	bmiColors[1].rgbRed = 0;
	bmiColors[1].rgbReserved = 0;

	bmiColors[2].rgbBlue = 0x1F;
	bmiColors[2].rgbGreen = 0;
	bmiColors[2].rgbRed = 0;
	bmiColors[2].rgbReserved = 0;


	FILE * filePtr = 0;       

	fopen_s(&filePtr, filename, "wb");
	if (NULL == filePtr)
	{
		return FALSE;
	}

	fwrite(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);

	fwrite(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);

	fwrite(bmiColors,3 * sizeof(RGBQUAD), 1, filePtr);

	fwrite(bitmapData, bitmapInfoHeader.biSizeImage, 1, filePtr);
	fclose(filePtr);
	return TRUE;
}



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭