當前位置:編程學習大全網 - 源碼下載 - 大俠,可以告訴我怎麽用C語言以2進制讀取png圖片的寬和高嗎?謝了!!!

大俠,可以告訴我怎麽用C語言以2進制讀取png圖片的寬和高嗎?謝了!!!

添加62字節的頭信息就可以了!

第壹部分為位圖文件頭BITMAPFILEHEADER,是壹個結構,其定義如下:

typedefstructtagBITMAPFILEHEADER{

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

這個結構的長度是固定的,為14個字節(WORD為無符號16位整數,DWORD為無符號32位整數),各個域的說明如下:

bfType

指定文件類型,必須是0x424D,即字符串 "BM ",也就是說所有.bmp文件的頭兩個字節都是 "BM "

bfSize

指定文件大小,包括這14個字節

bfReserved1,bfReserved2

為保留字,不用考慮

bfOffBits

為從文件頭到實際的位圖數據的偏移字節數,即圖3中前三個部分的長度之和。

第二部分為位圖信息頭BITMAPINFOHEADER,也是壹個結構,其定義如下:

typedef struct tagBITMAPINFOHEADER{

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

這個結構的長度是固定的,為40個字節(WORD為無符號16位整數,DWORD無符

號32位整數,LONG為32位整數),各個域的說明如下:

biSize

指定這個結構的長度,為40

biWidth

指定圖象的寬度,單位是象素

biHeight

指定圖象的高度,單位是象素

biPlanes

必須是1,不用考慮

biBitCount

指定表示顏色時要用到的位數,常用的值為1(黑白二色圖),4(16色圖),8(256色),24(真彩色圖)(新的.bmp格式支持32位色,這裏就不做討論了)。

biCompression

指定位圖是否壓縮,有效的值為BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是壹些Windows定義好的常量)。要說明的是,Windows位圖可以采用RLE4,和RLE8的壓縮格式,但用的不多。我們今後所討論的只有第壹種不壓縮的情況,即biCompression 為BI_RGB的情況。

biSizeImage

指定實際的位圖數據占用的字節數,其實也可以從以下的公式中計算出來:

biSizeImage=biWidth '*biHeight

要註意的是:上述公式中的biWidth '必須是4的整倍數(所以不是biWidth,而是biWidth ',表示大於或等於biWidth的,離4最近的整倍數。舉個例子,如果biWidth=240,則biWidth '=240;如果biWidth=241,biWidth '=244)如果biCompression為BI_RGB,則該項可能為零

biXPelsPerMeter

指定目標設備的水平分辨率,單位是每米的象素個數,關於分辨率的概念,我們將在打印部分詳細介紹。

biYPelsPerMeter

指定目標設備的垂直分辨率,單位同上。

biClrUsed

指定本圖象實際用到的顏色數,如果該值為零,則用到的顏色數為2的biBitCount次方。

biClrImportant

指定本圖象中重要的顏色數,如果該值為零,則認為所有的顏色都是重要的。

第三部分為調色板(Palette),當然,這裏是對那些需要調色板的位圖文件而言的。有些位圖,如真彩色圖,前面已經講過,是不需要調色板的,BITMAPINFOHEADER後直接是位圖數據。

調色板實際上是壹個數組,***有biClrUsed個元素(如果該值為零,則有2的biBitCount次方個元素)。數組中每個元素的類型是壹個RGBQUAD結構,占4個字節,其定義如下:

typedef struct tagRGBQUAD{

BYTE rgbBlue; //該顏色的藍色分量

BYTE rgbGreen; //該顏色的綠色分量

BYTE rgbRed; //該顏色的紅色分量

BYTE rgbReserved; //保留值

} RGBQUAD;

第四部分就是實際的圖象數據了。對於用到調色板的位圖,圖象數據就是該像素顏在調色板中的索引值,對於真彩色圖,圖象數據就是實際的R,G,B值。下面就2色,16色,256色位圖和真彩色位圖分別介紹。

對於2色位圖,用1位就可以表示該像素的顏色(壹般0表示黑,1表示白),所以壹個字節可以表示8個像素。

對於16色位圖,用4位可以表示壹個像素的顏色,所以壹個字節可以表示2個像素。

對於256色位圖,壹個字節剛好可以表示1個像素。

對於真彩色圖,三個字節才能表示1個像素,哇噻,好費空間呀,沒辦法,誰叫妳想讓圖的顏色顯得更亮麗呢,有得必有失嘛。

要註意兩點:

1.每壹行的字節數必須是4的整倍數,如果不是,則需要補齊。這在前面介紹biSizeImage時已經提到了。

2.壹般來說,.BMP文件的數據從下到上,從左到右的。也就是說,從文件中最先讀到的是圖象最下面壹行的左邊第壹個像素,然後是左邊第二個像素…接下來是倒數第二行左邊第壹個像素,左邊第二個像素…依次類推,最後得到的是最上面壹行的最右壹個像素。

了解這些以後呢 可以通過以二進制的方式“rb”打開妳想讀取的png圖片

FILE *fp

if(!(fp=open(“filename”,rb)))

printf(“open file error”);

打開成功後就可以通過文件指針讀取文件內容了。

  • 上一篇:獲取android手機的自帶存儲路徑和sdcard存儲路徑
  • 下一篇:論述:計算機各結構的合理性?
  • copyright 2024編程學習大全網