利用GDAL保存bmp格式的灰度图(二)

接着上一篇。假如灰度图的宽度不是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个变量也就说明每行之间是紧挨着的。

效果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值