今C言語で2つの画像(両方グレースケール)を読み込み,その差分画像を出力するプログラムを作成しているのですが,差分画像を上手く出力することが出来ず苦戦しています.書いたコードは以下になります.
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define WSIZE 2400/*元データの横サイズ*/
#define HSIZE 2000/*元データの縦サイズ*/
#define size 2400*2000
#define hdsize 37 //ヘッダの長さ+CRCの長さ
unsigned char PNGsig[8]={0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A};
unsigned char IHDR[4]={0x49,0x48,0x44,0x52};
unsigned char IDAT[4]={0x49,0x44,0x41,0x54};
unsigned char IEND[4]={0x49,0x45,0x4E,0x44};
unsigned char buf1[size];
unsigned char buf2[size];
unsigned char image1[size];
unsigned char image2[size];
unsigned char image3[size];
unsigned char header1[hdsize];
unsigned char header2[hdsize];
unsigned char IDATs1[4];
unsigned char IDATs2[4];
unsigned char IDATCRC1[4];
unsigned char IDATCRC2[4];
unsigned char IEND1[12];
unsigned char IEND2[12];
void image_input();
int main(){
image_input();
}
void image_input(){
FILE *fp1,*fp2,*fp3;
int l,k,i;
//画像ファイルの読み込み
char *filename1="basegray.png";
char *filename2="dst_gaus.png";
char *filename3="abcd.png";
fp1 = fopen(filename1, "rb");
fread(buf1, sizeof(unsigned char), sizeof(buf1) ,fp1);
fp2 = fopen(filename2, "rb");
fread(buf2, sizeof(unsigned char), sizeof(buf2) ,fp2);
//PNGシグネチャの確認
if(memcmp(PNGsig,buf1,8)==0 &&
memcmp(PNGsig,buf2,8)==0){
printf("pngファイルです");
}else{
printf("pngファイルではありません\n");
exit(1);
}
//ヘッダを取り出し
for(i=0;i<sizeof(header1);i++){
header1[i]=buf1[i];
header2[i]=buf2[i];
//printf("%d,",header1[i]);
}
//IDATの取り出し
for(i=0;i<4;i++){
if(IDAT[i]-buf1[i+hdsize]==0 &&
IDAT[i]-buf2[i+hdsize]==0){
IDATs1[i]=buf1[i+hdsize];
IDATs2[i]=buf2[i+hdsize];
//printf("%d,",IDATs1[i]);
}
}
//画像データ開始位置の確認
if(memcmp(IDAT,IDATs1,4)==0 &&
memcmp(IDAT,IDATs2,4)==0){
printf("画像データの確認");
}else{
printf("画像データの確認ができません\n");
exit(1);
}
//IENDの位置確認
for(i=0;i<sizeof(buf1);i++){
image1[i]=buf1[i+42];
if(IEND[3]-image1[i]==0 &&
IEND[2]-image1[i-1]==0 &&
IEND[1]-image1[i-2]==0 &&
IEND[0]-image1[i-3]==0){
printf("終わり");
IDATCRC1[0]=image1[i-11];
IDATCRC1[1]=image1[i-10];
IDATCRC1[2]=image1[i-9];
IDATCRC1[3]=image1[i-8];
IEND1[0]=image1[i-7];
IEND1[1]=image1[i-6];
IEND1[2]=image1[i-5];
IEND1[3]=image1[i-4];
IEND1[4]=image1[i-3];
IEND1[5]=image1[i-2];
IEND1[6]=image1[i-1];
IEND1[7]=image1[i];
IEND1[8]=image1[i+1];
IEND1[9]=image1[i+2];
IEND1[10]=image1[i+3];
IEND1[11]=image1[i+4];
k=i;
//printf("%d",k);
break;
}
}
for(i=0;i<sizeof(buf2);i++){
image2[i]=buf2[i+41];
if(IEND[3]-image2[i]==0 &&
IEND[2]-image2[i-1]==0 &&
IEND[1]-image2[i-2]==0 &&
IEND[0]-image2[i-3]==0){
printf("終わり");
IDATCRC2[0]=image2[i-11];
IDATCRC2[1]=image2[i-10];
IDATCRC2[2]=image2[i-9];
IDATCRC2[3]=image2[i-8];
IEND2[0]=image2[i-7];
IEND2[1]=image2[i-6];
IEND2[2]=image2[i-5];
IEND2[3]=image2[i-4];
IEND2[4]=image2[i-3];
IEND2[5]=image2[i-2];
IEND2[6]=image2[i-1];
IEND2[7]=image2[i];
IEND2[8]=image2[i+1];
IEND2[9]=image2[i+2];
IEND2[10]=image2[i+3];
IEND2[11]=image2[i+4];
l=i;
//printf("%d,",l);
break;
}
}
//差分計算
//この部分の計算が上手くいかない
for(i=1;i<l;i++){
image3[i]=abs(image1[i]-image2[i]);
//printf("%x,",image3[i]);
//image1[i]=image3[i];
}
/*
fp3 = fopen(filename3, "wb");
fwrite(buf1, sizeof(unsigned char), 42 ,fp3);
fwrite(image1, sizeof(unsigned char), k ,fp3);
fwrite(IDATCRC1,sizeof(unsigned char),4,fp3);
fwrite(IEND1, sizeof(unsigned char), sizeof(IEND1) ,fp3);
fp4 = fopen(filename4, "wb");
fwrite(buf2, sizeof(unsigned char), sizeof(buf2) ,fp4);
*/
}
画像データはIDATチャンクに入ってるので,それの差分で作成出来るのではないか,と考えていたのですがどうも上手く行きません.どのようにすれば良いか検討がつかない状態なので,教えていただけないでしょうか?
OSはMAC OS10.7.5,環境はXcode4.5で,c言語は始めてだいたい2ヶ月〜3ヶ月くらいです.
文章が読みづらい,コードが見づらい部分があると思いますが,どうかよろしくお願いします.