4 - 转换 8 位灰度图片为数组形式

1、提取数据,转换为数组

  • 由 BMP 图片的编码可知,原始的图像数据中的读取方式是 由下到上、由左到右;为符合我们常见的数组形式,因此我们将其转换成 由上到下、由左到右 的二维数组形式。
/************************************************************
*Function:		bmp8_GetImgArray
*Description:	提取 BMP 8位灰度图像中的图像数据,并将其有效数据提取成二维数组
*Params:		imgData - 原始的图像数据,包含无效数据
*				width - 图像宽度
*				height - 图像高度
*Return:		imgArr - 图像的有效二维数组
************************************************************/
uint8_t** bmp8_GetImgArray(uint8_t* imgData, uint32_t width, uint32_t height)
{
	// 计算真实行字节
	uint32_t lineWidth = WidthBytes(width * 8);
	
	// 创建二维数组空间
	uint8_t** imgArrTemp = new uint8_t* [height]();		// 临时的二维数组空间,用于直接存储原始的图像数据
	for (int i = 0; i < height; i++) {
		imgArrTemp[i] = new uint8_t[width]();
	}
	uint8_t** imgArr = new uint8_t* [height]();			// 结果二维数组空间,用于存储转换后结果的图像数据
	for (int i = 0; i < height; i++) {
		imgArr[i] = new uint8_t[width]();
	}

	// 读取数据
	for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < width; j++) {
			uint32_t point = i * lineWidth + j;		// 定义真实的坐标位置	
			imgArrTemp[i][j] = imgData[point];		// 数值拷贝
		}
	}

	// 坐标转换,由原来的图像数据中的 由下到上,由左到右 转换为 由上到下,由左到右
	for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < width; j++) {
			imgArr[i][j] = imgArrTemp[height - i - 1][j];
		}
	}

	// 释放临时变量地址空间
	for (uint32_t i = 0; i < height; i++) {
		delete[] imgArrTemp[i];
	}
	delete[] imgArrTemp;

	return imgArr;
}

2、将二维数组转换为灰度图片的位图数据

  • 在向 BMP 结果图片中存入结果数据的时候,需要把结果二维数组在转换为一维数组的形式,并需注意无效位图数据的填充,即满足行字节。
/************************************************************
*Function:		imgArray_2_Bmp8
*Description:	将 图像的二维数组 转换成需要存入结果 BMP 灰度图像的一维数据,包含无效数值
*Params:		imgArr - 图像的二维数组
*				width - 图像宽度
*				height - 图像高度
*Return:		dstData - 合成的结果图像数据
************************************************************/
uint8_t* imgArray_2_Bmp8(uint8_t** imgArr, int width, int height)
{
	// 计算真实行字节
	uint32_t lineWidth = WidthBytes(width * 8);
	
	// 临时的二维数组空间,用于存储结果图像数据
	uint8_t** imgArrTemp = new uint8_t * [height]();		
	for (uint32_t i = 0; i < height; i++) {
		imgArrTemp[i] = new uint8_t[width]();
	}

	// 坐标转换,由原来的图像数据中的 由下到上,由左到右 转换为 由上到下,由左到右
	for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < width; j++) {
			imgArrTemp[i][j] = imgArr[height - i - 1][j];
		}
	}
	
	// 转换成需要存入结果图像的一维数组
	uint8_t* dstData = new uint8_t[height * lineWidth];
	memset(dstData, 0, height * lineWidth);
	
	// 数据写入
	for (uint32_t i = 0; i < height; i++) {
		for (uint32_t j = 0; j < width; j++) {
			uint32_t point = i * lineWidth + j;		// 定义真实的坐标位置	
			dstData[point] = imgArrTemp[i][j];
		}
	}

	// 释放临时变量地址空间
	for (uint32_t i = 0; i < height; i++) {
		delete[] imgArrTemp[i];
	}
	delete[] imgArrTemp;

	return dstData;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值