① 大俠,可以告訴我怎麼用c語言以2進制讀取png圖片的寬和高嗎謝了!!!
添加62位元組的頭信息就可以了!
第一部分為點陣圖文件頭BITMAPFILEHEADER,是一個結構,其定義如下:
{
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」);
打開成功後就可以通過文件指針讀取文件內容了。
② 如何用c語言編程讀入一張png格式的圖片。
使用GDI+(只有一行代碼):
Image img(TEXT(PNG圖片路徑));
還有libpng等等庫,如果要自己實現讀取代碼就比較繁瑣了
③ 如何用C++在屏幕上顯示png圖片
如何在Windows應用程序中顯示jpeg和png格式的圖片 源代碼片段(zip壓縮包,5k) 依賴的第三方庫(zip壓縮包,900k) 經常看到有人在bbs技術版面上問類似的問題,簡要介紹一下怎麼解決這個小問題。因為Win32 API只對bmp格式的點陣圖提供基本支持,所以需要使用第三方庫來完成這個任務。GDI+其實就是一個很好的選擇,不僅支持多種圖片格式,而且支持圖像處理操作,並且做了一定的優化,介面定義也十分清晰。 這里講的是基於Independent Jpeg Group的JpegLib和libpng.org的libpng兩個庫的解決方案。Jpeg和png兩種格式都是帶壓縮的圖像格式,,所不同的是jpeg使用了有損壓縮,png使用了無損壓縮。要在Windows程序中顯示這兩種圖片需要將壓縮過的圖片在內存中還原為點陣圖。相對而言bmp格式的圖片處理起來就容易得多,以至於查查資料每個人都可以寫一個讀取bmp圖片的模塊,當然,也不完全那麼容易,還要考慮多種顏色模式和bmp圖片中4像素對齊的問題。OK,不管jpeg和png讀取多麼麻煩,ijg和libpng.org已經寫好了讀取這兩種格式文件的庫,這兩個庫都是用C語言寫的,期中libpng依賴於zlib,而zlib也是用C寫成。 最近做的項目需要使用jpeg和png圖片,這里把一些代碼片段(沒有DEMO,單讀取文件部分是完整的)分享一下,這些代碼的原始版本並不是我們小組寫的,但是我們進行了封裝並且修復了一些bug(比如內存泄露)。本來是想做個小DEMO演示一下,但是工作量比較大(我試圖同時支持vc6,vc71,vc80,dev-cpp等等)。 以下是載入jpeg圖片的方法: C++代碼 HBITMAP PictureLoader::LoadJpegPicture( const char* fileName ) { FILE * jpegFile; struct jpeg_error_mgr jerr; struct jpeg_decompress_struct cinfo; if ((jpegFile = fopen(fileName, "rb")) == NULL) { return HBITMAP(0); } cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, jpegFile); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); int rowSize = cinfo.output_width * cinfo.output_components; int width=cinfo.output_width; int height=cinfo.output_height; BYTE *bmpBuffer=new BYTE[(height+1)*width*3]; BYTE **pBuffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, rowSize, 1); while(cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, pBuffer, 1); int start=rowSize*(cinfo.output_scanline-1); for(int i = 0; i < rowSize; i++) { bmpBuffer[start+i]=pBuffer[0][i]; } } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); HBITMAP bitmap = CreateBitmapFromBuffer(bmpBuffer, width, height); fclose(jpegFile); delete[] bmpBuffer; return bitmap; }
④ C語言中如何顯示圖片
1、圖片也是屬於文件類型的一種,圖片屬於二進制文件。使用fopen函數的二進制模式「rb」就可以打開。
2、常式:
#include<stdlib.h>
#include<stdio.h>
intmain()
{
FILE*fpPhoto,*fpText,*fpTarget;
intiRead;
charszBuf[100];
printf("請輸入第一個文件名(bmp): ");
gets(szBuf);
fpPhoto=fopen(szBuf,"rb");
printf("請輸入第二個文件名(txt): ");
gets(szBuf);
fpText=fopen(szBuf,"rb");
printf("請輸入目的文件名(bmp): ");
gets(szBuf);
fpTarget=fopen(szBuf,"wb");
if(!fpPhoto||!fpText||!fpTarget)
{
printf("打開文件失敗! ");
system("pause");
return-1;
}
while((iRead=fread(szBuf,1,sizeof(szBuf),fpPhoto))>0)
fwrite(szBuf,1,iRead,fpTarget);
while((iRead=fread(szBuf,1,sizeof(szBuf),fpText))>0)
fwrite(szBuf,1,iRead,fpTarget);
fclose(fpPhoto);
fclose(fpText);
fclose(fpTarget);
return0;
}
⑤ 怎樣用C語言將png圖像讀入數組並顯示
c語言讀取圖片原理:通過文件流的方式讀入到Byte的二進制數組中,之後,使用圖像分析演算法將圖像顯示到屏幕上,要將數組中的值轉換為像素。
參考代碼如下:
//function definition
void ImageRead(AnsiString name,int &width,int &height,int *r,int *g,int *b)
{
//read image
FILE *fp;
if((fp=fopen(name.c_str(),"rb"))==NULL) {
printf("cannot open bmp.name\n");
return ;
}
fread(&bfType,sizeof(WORD),1,fp);
if(bfType!=0x4d42) {//該值必需是0x4D42,也就是字元'BM'
printf("the input map is not bmp type");
return ;
}
fread(&bfSize,sizeof(DWORD),1,fp);
fread(&bfReserved1,sizeof(WORD),1,fp);
fread(&bfReserved2,sizeof(WORD),1,fp);
fread(&bfOffBits,sizeof(DWORD),1,fp);
fread(&bih,sizeof(BITMAPINFOHEADER),1,fp);
width=bih.biWidth ;
⑥ 如何在c語言程序中導入png圖片
#include <graphics.h>
#include <stdio.h>
int main()
{
int driver=0,mode=0;
initgraph(&driver,&mode,"");
IMAGE img_1;
loadimage(&img_1, _T("1.jpg"));
putimage(20, 20,&img_1);
getchar();
closegraph();
}