8
A
回答
3
PPM文件由9個部分構成,由空格分隔。
- 打開文件
- 讀,直到第一個空格,並檢查你有
P6
。然後跳過其他空格。 - 直到下一個空白爲止,將緩衝區轉換爲整數寬度。然後跳過其他空格
- 讀取直到下一個空格,將緩衝區轉換爲整數高度。然後跳到其它的空格
- 分配整數的高度*寬度
- 的尺寸的二維陣列讀取由線最大-VAL
- 讀取線和填充所述陣列
+2
我認爲你需要澄清這個答案是怎麼回事,這不是很清楚。 – 2010-04-22 19:52:56
+1
許多PNM文件會失敗,因爲它沒有對註釋行進行說明。 – deegee 2013-09-21 23:41:30
18
下面的代碼顯示如何讀取,更改像素顏色並以 PPM格式寫入圖像。我希望它有幫助。
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned char red,green,blue;
} PPMPixel;
typedef struct {
int x, y;
PPMPixel *data;
} PPMImage;
#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR 255
static PPMImage *readPPM(const char *filename)
{
char buff[16];
PPMImage *img;
FILE *fp;
int c, rgb_comp_color;
//open PPM file for reading
fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//read image format
if (!fgets(buff, sizeof(buff), fp)) {
perror(filename);
exit(1);
}
//check the image format
if (buff[0] != 'P' || buff[1] != '6') {
fprintf(stderr, "Invalid image format (must be 'P6')\n");
exit(1);
}
//alloc memory form image
img = (PPMImage *)malloc(sizeof(PPMImage));
if (!img) {
fprintf(stderr, "Unable to allocate memory\n");
exit(1);
}
//check for comments
c = getc(fp);
while (c == '#') {
while (getc(fp) != '\n') ;
c = getc(fp);
}
ungetc(c, fp);
//read image size information
if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
exit(1);
}
//read rgb component
if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
exit(1);
}
//check rgb component depth
if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
exit(1);
}
while (fgetc(fp) != '\n') ;
//memory allocation for pixel data
img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));
if (!img) {
fprintf(stderr, "Unable to allocate memory\n");
exit(1);
}
//read pixel data from file
if (fread(img->data, 3 * img->x, img->y, fp) != img->y) {
fprintf(stderr, "Error loading image '%s'\n", filename);
exit(1);
}
fclose(fp);
return img;
}
void writePPM(const char *filename, PPMImage *img)
{
FILE *fp;
//open file for output
fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//write the header file
//image format
fprintf(fp, "P6\n");
//comments
fprintf(fp, "# Created by %s\n",CREATOR);
//image size
fprintf(fp, "%d %d\n",img->x,img->y);
// rgb component depth
fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);
// pixel data
fwrite(img->data, 3 * img->x, img->y, fp);
fclose(fp);
}
void changeColorPPM(PPMImage *img)
{
int i;
if(img){
for(i=0;i<img->x*img->y;i++){
img->data[i].red=RGB_COMPONENT_COLOR-img->data[i].red;
img->data[i].green=RGB_COMPONENT_COLOR-img->data[i].green;
img->data[i].blue=RGB_COMPONENT_COLOR-img->data[i].blue;
}
}
}
int main(){
PPMImage *image;
image = readPPM("can_bottom.ppm");
changeColorPPM(image);
writePPM("can_bottom2.ppm",image);
printf("Press any key...");
getchar();
}
相關問題
- 1. 文件讀取並將其存儲在數組中spark
- 2. 從文本文件中讀取內容,並將其存儲到一個數組
- 3. Java讀取文本文件並將其存儲爲數組
- 4. 如何從文件中讀取數組並將其存儲在數組中
- 5. 讀取CSV的單個列並將其存儲在數組中
- 6. 使用awk讀取文件的每一行並將其存儲到數組中
- 7. Java:讀取文件並將其數據存儲在ArrayList中?
- 8. 從.txt文件讀取數據並將其存儲在JTable中
- 9. 將整數和數組存儲在一個文件中並讀取它們
- 10. 讀取文本文件並將其存儲在數組中(Android開發)
- 11. C++讀取文本文件並將其存儲到向量
- 12. 讀取文件並存儲到數組
- 13. 從文件中讀取數字(整數)並將其存儲爲二維數組
- 14. 如何讀取文件行並將其存儲? C++
- 15. 從C文本文件中逐行讀取整數並將它們存儲在一個數組中
- 16. 如何讀取文件夾中的多個texfile並將每個文本文件存儲在數組中C#
- 17. 讀取映射文件並將其存儲在緩衝區中
- 18. 從文件讀取Java並將整數存儲在兩個數組中
- 19. 讀取文件並將名稱和數字存儲在兩個數組中
- 20. 計數文件的文字並將其存儲在數組中?
- 21. C++從文件中讀取文本並將其存儲在獨立的變量
- 22. C程序 - 如何讀取文件並將其文本存儲在變量中?
- 23. 讀取文件,並分割其內容,並在一個數組
- 24. 空指針錯誤讀取文本文件並將其存儲在一個數組列表中
- 25. Java讀取文本文件2列並存儲在數組中
- 26. 從文本文件中讀取數據並將其存儲在對象中
- 27. 從數據庫中讀取一行數據並將其存儲到數組中
- 28. Java - 讀取並存儲在數組中
- 29. 從文件中讀取並存儲在數組中
- 30. 從文件中讀取並存儲在不同的數組中
你有什麼麻煩?如果你發佈了一個不適合的嘗試,找到這個bug很容易。 – caf 2010-04-23 00:48:09