1、提取数据,转换为数组
- 由 BMP 图片的编码可知,原始的图像数据中的读取方式是 由下到上、由左到右;为符合我们常见的数组形式,因此我们将其转换成 由上到下、由左到右 的二维数组形式。
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 结果图片中存入结果数据的时候,需要把结果二维数组在转换为一维数组的形式,并需注意无效位图数据的填充,即满足行字节。
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;
}