1、使用Magick++讀取,適用於各種圖片格式(Magick++支援)
相關資料:
http://www.imagemagick.org/Magick++/Image.html
http://www.imagemagick.org/Magick++/Documentation.html
http://www.imagemagick.org/discourse-server/viewtopic.php?f=2&t=16625
int _tmain(int argc, _TCHAR* argv[]) { Geometry g(800, 533); Image theI; FILE* fh; float *floatPixelMap; try { theI.read(g, "./bluejay.jpg"); int height = theI.rows(); int width = theI.columns(); int size = height * width * 4; PixelPacket* myMap = theI.getPixels(0, 0, width, height); floatPixelMap = new float[size]; for (int counter = 0, k=0; counter < size; counter++, ++k) { floatPixelMap[counter++] = (float)myMap[k].red / 255.0f; floatPixelMap[counter++] = (float)myMap[k].green / 255.0f; floatPixelMap[counter++] = (float)myMap[k].blue / 255.0f; floatPixelMap[counter] = (float)myMap[k].opacity / 255.0f; }//end for loop fh = fopen("./bluejay32float.procd.rgba", "wb"); fwrite((void *)floatPixelMap, sizeof(float), size, fh); }//end try block catch(Exception& ex) { cout << "imagicktstr,error," << ex.what() << endl; }//end catch block return 0; }//end main
2、直接解析BMP檔案格式,只能讀取bmp格式
#include <string.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #define WIDTHBYTES(bits) (((bits)+31)/32*4) typedef unsigned char BYTE;//字元型 typedef unsigned short WORD;//短整型 typedef unsigned long DWORD;//長整形 typedef long LONG; //位元影像檔案頭資訊結構定義 //其中不包含檔案類型資訊(由於結構體的記憶體結構決定,要是加了的話將不能正確讀取檔案資訊) typedef struct tagBITMAPFILEHEADER { //WORD bfType; DWORD bfSize; //檔案大小 WORD bfReserved1; //保留字,不考慮 WORD bfReserved2; //保留字,同上 DWORD bfOffBits; //實際位元影像資料的位移位元組數,即前三個部分長度之和 } BITMAPFILEHEADER; //資訊頭BITMAPINFOHEADER,也是一個結構,其定義如下: typedef struct tagBITMAPINFOHEADER{ //public: DWORD biSize; //指定此結構體的長度,為40 LONG biWidth; //位元影像寬 LONG biHeight; //位元影像高 WORD biPlanes; //平面數,為1 WORD biBitCount; //採用顏色位元,可以是1,2,4,8,16,24,新的可以是32 DWORD biCompression; //壓縮方式,可以是0,1,2,其中0表示不壓縮 DWORD biSizeImage; //實際位元影像資料佔用的位元組數 LONG biXPelsPerMeter; //X方向解析度 LONG biYPelsPerMeter; //Y方向解析度 DWORD biClrUsed; //使用的顏色數,如果為0,則表示預設值(2^顏色位元) DWORD biClrImportant; //重要顏色數,如果為0,則表示所有顏色都是重要的 } BITMAPINFOHEADER; //調色盤Palette,當然,這裡是對那些需要調色盤的位元影像檔案而言的。24位和32位是不需要調色盤的。 //(似乎是調色盤結構體個數等於使用的顏色數。) typedef struct tagRGBQUAD { //public: BYTE rgbBlue; //該顏色的藍色分量 BYTE rgbGreen; //該顏色的綠色分量 BYTE rgbRed; //該顏色的紅色分量 BYTE rgbReserved; //保留值 } RGBQUAD; void showRgbQuan(tagRGBQUAD* pRGB) { printf("(%-3d,%-3d,%-3d) ",pRGB->rgbRed,pRGB->rgbGreen,pRGB->rgbBlue); } int main(){ char ch,pd; int b,c,m,d,w,e,f; int x,y; unsigned char *q; int i,j; unsigned char a[2]; char strFile[50]; BITMAPFILEHEADER bitHead; BITMAPINFOHEADER bitInfoHead; tagRGBQUAD *pRgb ; FILE *fp; FILE *p; q=(unsigned char*)malloc(1); printf("mkx**用C語言編程來讀取BMP檔案某一像素點的資料**/n請輸入一個bmp檔案:/n"); scanf("%s",strFile); fp=fopen(strFile,"rb"); if(fp!=NULL) { printf("file open success!/n"); WORD fileType; fread(&fileType,1,sizeof(WORD),fp); if(fileType != 0x4d42) { printf("file is not .bmp file!"); system("pause"); return 0; } } else { printf("file open fail!/n"); system("pause"); return 0; } //讀檔案頭資訊,並列印檔案頭資訊各項的值 fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),fp); printf("bmp檔案頭資訊/n檔案大小:%d/n保留字:%d/n保留字:%d/n實際位元影像資料的位移位元組數:%d/n/n", bitHead.bfSize,bitHead.bfReserved1,bitHead.bfReserved2,bitHead.bfOffBits); //讀檔案資訊頭,並列印檔案資訊頭各項的值 fread(&bitInfoHead,1,sizeof(tagBITMAPINFOHEADER),fp); printf("bmp檔案資訊頭/n結構體的長度:%d/n位元影像寬:%d/n位元影像高:%d/nbiPlanes平面數:%d/nbiBitCount採用顏色位元:%d/n壓縮方式:%d/nbiSizeImage實際位元影像資料佔用的位元組數:%d/nX方向解析度:%d/nY方向解析度:%d/n使用的顏色數:%d/n重要顏色數:%d/n", bitInfoHead.biSize,bitInfoHead.biWidth,bitInfoHead.biHeight,bitInfoHead.biPlanes,bitInfoHead.biBitCount,bitInfoHead.biCompression,bitInfoHead.biSizeImage,bitInfoHead.biXPelsPerMeter,bitInfoHead.biYPelsPerMeter,bitInfoHead.biClrUsed,bitInfoHead.biClrImportant); if(bitInfoHead.biBitCount < 24){ printf("該檔案有調色盤,即該位元影像為非真彩色/n/n"); m=1; if(bitInfoHead.biBitCount =8){ long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant Number; pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD)); memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD)); int num = fread(pRgb,4,nPlantNum,fp); printf("Color Plate Number: %d/n",nPlantNum); printf("顏色板資訊:/n"); for (int i =0; i<nPlantNum;i++) { if (i%5==0) { printf("/n"); } showRgbQuan(&pRgb[i]); } printf("/n"); } } else{ printf("該位元影像為24位真彩色/n/n"); m=3; } fclose(fp); while(ch!='N'){ p=fopen(strFile,"rb"); ch=NULL; f=bitInfoHead.biHeight; e=bitInfoHead.biWidth; b=bitHead.bfOffBits; printf("**輸入指定像素點的資料**(行:1~%d 列1~%d)/n",f,e); printf("請輸入第i行:"); scanf("%d",&x); printf("請輸入第j列:"); scanf("%d",&y); c=b+(x-1)*e*m+m*(y-1); fseek(p,c,0); //printf("%d/n",m); if(m<2){ fread(&a[0],1,1,p); printf("該點像素點的資料(十六進位)為:%x ",a[0]); printf("用十進位表示:%d/n",a[0]); d=a[0]; printf("它對應的rgb值為:"); showRgbQuan(&pRgb[d]); printf("/n"); } else { for(i=0;i<3;i++){ fread(&a[i],1,1,p); // printf("%x/n",a[i]); } printf("十六進位表示:/n藍:%x/n綠:%x/n紅:%x/n",a[0],a[1],a[2]); printf("十進位表示:/n藍:%d/n綠:%d/n紅:%d/n",a[0],a[1],a[2]); } rewind(p); //w=ftell(p); //printf("%d",w); fclose(p); printf("**繼續請輸入任一字元,如需退出請輸入N/n"); getchar(); scanf("%c",&ch); } printf("感謝您使用~/n"); system("pause"); return 0; }