接着上一篇。假如灰度图的宽度不是4的整数倍,如何将这样的图片保存到本地bmp文件中?下图是一个宽度447的图片
这个447x340的图像不能 像上一篇那样保存为bmp,因为photoshop会自动在bmp文件里补齐4字节,保证图片满足bmp格式要求。所以我将这个图片保存为raw格式,并且在格式开头增加8字节(也就是两个int型变量):第一个变量的含义是图片的宽度。也就是447;第二个变量的含义是高度,也就是340.
由于GDAL只接受每行字节数为4的整数倍,所以在建立bmp文件时,应使其宽度=448.这通过下面代码实现:
int iImgWidth = (iWidth + 3) / 4 * 4;
但是实际的数据每行447个像素,这样一来,必须告知GDAL。
int iImgWidth = (iWidth + 3) / 4 * 4;
GDALDataset * pDataSet = pDriver->Create(arrFileName, iImgWidth, iHeight, 1, GDT_Byte, NULL);
pDataSet->RasterIO(GF_Write,
0,
0,
iWidth,
iHeight,
pData ,
iWidth,
iHeight,
GDT_Byte,
1,
NULL,
1,
iWidth,
NULL);//用法见https://www.gdal.org/classGDALDataset.html#a80d005ed10aefafa8a55dc539c2f69da
GDALClose((GDALDatasetH) pDataSet);
create函数创建了一个448x340的图片,保证符合bmp的要求。
接下来的RasterIO函数的第二、第三个变量(0,0),以及第4第5个变量(iWidth, iHeight),表示被写入的区域从被写入文件的(0,0)点开始,向右iWidth个 像素,向下iHeight个字节。第7,8个变量(iWidth, iHeight)表示数据源的从pData地址起始,宽度iWidth,高度iHeight.第12个变量代表数据源的每行相邻字节之间间距是1,也就是紧挨着;第13个变量代表相邻行的首字节之间间隔iWidth个字节。由于数据源本来每行就只有iWidth = 447个字节,第13个变量也就说明每行之间是紧挨着的。
效果: