とりあえず適当な四角形を書き出すサンプル書いてみました。
サンプルのプログラムは上のサンプルを利用して作りました。
関数を呼ぶ順番と中身が少し変わっているだけです。
ファイルはbmpですがpgmも無圧縮だと思うので、恐らく同じ要領で出来ると思います。
以下のプログラムで作った画像が添付画像です。
bmpのヘッダはあえて、既存のファイルからコピーする方法を取りました。
まずはコピーでやってみて、出来たらヘッダファイルの構造体を用意し、
ちゃんと画像サイズなども指定出来るようにしてみて下さい。
#include <stdio.h>
#include <stdlib.h>
/* ビットマップの横 */
#define YOKO 256
/* ビットマップの縦 */
#define TATE 256
/* ビットマップのヘッダサイズ */
#define HEAD 54
/* トータルサイズ */
#define TOTAL (YOKO*TATE*3)
typedef struct{
//[0]青 [1]緑 [2]赤
unsigned char Col[3];
}Color_t;//色の構造体
/* ビットマップデータのヘッダ部分を読み込む */
int ReadBmpHead(char *name, unsigned char BmpHead[/url]){
FILE *fp;
fp = fopen( name , "rb" );
if( fp == NULL ){
printf( "%sが開けません。",name);
exit (1);
}
fread( BmpHead, HEAD, 1, fp );
fclose(fp);
return 0;
}
/* ビットマップデータを書き出す */
int WriteBmp(char *name, unsigned char BmpHead[/url], unsigned char BmpData[/url]){
FILE *fp;
fp = fopen( name , "wb" );
if( fp == NULL ){
printf( "%sがエラーっす。",name);
exit (1);
}
fwrite( BmpHead, HEAD, 1, fp );
fwrite( BmpData, TOTAL, 1, fp );
fclose(fp);
return 0;
}
/* ビットマップデータをPixelDataからBmpDataに変換する */
void ConvToBmpData( Color_t PixelData[ YOKO ][ TATE ], unsigned char BmpData[/url] ){
int t=0;
int x,y,c;
for(y=TATE-1; y>=0; y--){
for(x=0; x<YOKO; x++){
for(c=0; c<3; c++){
BmpData[t]=PixelData[y][x].Col[c];
t++;
}
}
}
}
/* 画像に赤と青の四角形を書き込む */
void WriteColor( Color_t PixelData[ YOKO ][ TATE ] ){
int x,y;
for(y=100; y<180; y++){
for(x=100; x<180; x++){
PixelData[y][x].Col[2] = 255;
}
}
for(y=120; y<200; y++){
for(x=120; x<200; x++){
PixelData[y][x].Col[0] = 255;
}
}
}
int main(){
Color_t PixelData[ YOKO ][ TATE ]={0,};
unsigned char BmpData[TOTA[/url];
unsigned char BmpHead[HEAD];
ReadBmpHead( "pict.bmp", BmpHead );//ヘッダを読みんで
WriteColor( PixelData );//ピクセルデータを書き込んで
ConvToBmpData( PixelData, BmpData );//変換して
WriteBmp( "pict2.bmp", BmpHead, BmpData);//書き込む
}