PPM图片格式及其C读写代码
PPM(Portable Pixmap Format)還有兩位兄長,大哥名叫「PBM」,二哥人稱「PGM」,他們?nèi)值芨饔兴L,下面為你們一一介紹:
- PBM 是位圖(bitmap),僅有黑與白,沒有灰
- PGM 是灰度圖(grayscale)
- PPM 是通過RGB三種顏色顯現(xiàn)的圖像(pixmaps)
每個圖像文件的開頭都通過2個字節(jié)「magic number」來表明文件格式的類型(PBM, PGM, PPM),以及編碼方式(ASCII 或 Binary),magic number分別為P1、P2、P3、P4、P5、P6。
| Magic Number | Type | Encoding |
|---|---|---|
| P1 | Bitmap | ASCII |
| P2 | Graymap | ASCII |
| P3 | Pixmap | ASCII |
| P4 | Bitmap | Binary |
| P5 | Graymap | Binary |
| P6 | Pixmap | Binary |
編碼方式
ASCII格式適合人類閱讀理解,可以用文本編輯器打開,讀取對應(yīng)圖像的數(shù)據(jù)(比如PPM格式的RGB值)。 Binary格式適合機(jī)器閱讀,按照二進(jìn)制形式,順序存儲圖像信息,不用空格分隔,所以圖像處理起來更有效率,占用空間容量更少(由于缺少空格)。
下面著重講解PPM格式:
PPM圖像格式分為兩部分,分別為頭部分和圖像數(shù)據(jù)部分。
頭部分:由3部分組成,通過換行或空格進(jìn)行分割,一般PPM的標(biāo)準(zhǔn)是空格。
第1部分:P3或P6,指明PPM的編碼格式,
第2部分:圖像的寬度和高度,通過ASCII表示,
第3部分:最大像素值,0-255字節(jié)表示。
在這三部分中,可能會有注釋。注釋以#開頭,例如:# CREATOR: GIMP PNM Filter Version 1.1。
圖像數(shù)據(jù)部分:
ASCII格式:按RGB的順序排列,RGB中間用空格隔開,圖片每一行用回車隔開。
Binary格式:PPM用24bits代表每一個像素,紅綠藍(lán)分別占用8bits。
舉例:
P3 3 2 255
255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0
- P3: PPM編碼格式為ASCII
- 3: 3列像素
- 2: 2行像素
- 255: 最大像素值
C語言讀寫代碼
// 從文件讀取PPM圖片
void ppm_load(char* filename, unsigned char* out_data, int* w, int* h)
{char header[1024];FILE* fp = NULL;int line = 0;fp = fopen(filename, "rb");// 讀取圖片格式(例如:"P6")// 高寬在第二行非注釋數(shù)據(jù)while(line < 2){ fgets(header, 1024, fp);if(header[0] != '#'){++line;}}// 讀取寬高sscanf(header,"%d %d\n", w, h);// 獲取最大像素值fgets(header, 20, fp);// get rgb datafread(*data, (*w)*(*h)*3, 1, fp);fclose(fp);
}// 寫ppm圖像到文件
void ppm_save(char* filename, unsigned char* data, int w, int h)
{FILE* fp;char header[20];fp = fopen(filename, "wb");// 寫圖片格式、寬高、最大像素值fprintf(fp,"P6\n%d %d\n255\n",w,h);// 寫RGB數(shù)據(jù)fwrite(data, w*h*3, 1, fp);fclose(fp);
}
注:如果出現(xiàn)?error c4996: 'fopen': This function or variable may be unsafe
解決方案,項目 =》屬性 =》c/c++? =》預(yù)處理器=》點擊預(yù)處理器定義,編輯,加入_CRT_SECURE_NO_WARNINGS,即可。
總結(jié)
以上是生活随笔為你收集整理的PPM图片格式及其C读写代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CUDA学习3-GridBlock
- 下一篇: Intro to Parallel Pr