1. 程式人生 > >利用GDAL儲存bmp格式的灰度圖(二)

利用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個變數也就說明每行之間是緊挨著的。

效果: