C言語なら俺に聞け(入門編)Part 73
■ このスレッドは過去ログ倉庫に格納されています
0684デフォルトの名無しさん
2010/11/20(土) 07:55:31#include <stdlib.h>
#define T typedef
T unsigned long ul; T unsigned short us; T unsigned char uc; T double D;
T struct{uc r;uc g;uc b;}P;T struct{long w;long h;P p[4096*4096];}B;
T struct{ul f_sz;ul pd0;ul p_ofs;ul bhs;long w;long h;us pd1;us pl;us bit;ul cmp;}H;
void r_B(B* a,char* f){
FILE* fp=fopen(f,"rb");H hd;fseek(fp,2,SEEK_SET);fread(&hd,sizeof(H),1,fp);
a->w=hd.w;a->h=hd.h;ul p_ofs=hd.p_ofs;int q=4-(a->w%4);q=(q==4)?0:q;
P* p;int j=a->h;while(j-->0){
p=a->p+(a->w*3)*j;fseek(fp,p_ofs+((a->w*3)+q)*j,SEEK_SET);fread(p,sizeof(P),a->w*3,fp);
}
}
void w_B(B* a,char* f){
FILE* fp=fopen(f,"wb");fseek(fp,0,SEEK_SET);uc BM[2]="BM"; fwrite(BM,sizeof(uc),2,fp);
int q=4-(a->w%4);q=(q==4)?0:q;ul p_ofs=54;
H hd={p_ofs+((a->w*3)+q)*a->h,0,p_ofs,40,a->w,a->h,1,24,0};fseek(fp,2,SEEK_SET);fwrite(&hd,sizeof(H),1,fp);
P* p;int j=a->h;while(j-->0){
p=a->p+(a->w*3)*j;fseek(fp, p_ofs+((a->w*3)+q)*j,SEEK_SET);fwrite(p,sizeof(P),a->w*3,fp);
}
}
void p_P(P* p){
D o=1.2;D q=0.5;D s=0.2;D r=p->r,g=p->g,b=p->b;r/=255;g/=255;b/=255;
D* u=(r>g)?((r>b)?&r:&b):((g>b)?&g:&b);D* d=(r<g)?((r<b)?&r:&b):((g<b)?&g:&b);
D _u=*u,_d=*d;r+=(1-_u)*((_u-_d+s)*o);g+=(1-_u)*((_u-_d+s)*o);b+=(1-_u)*((_u-_d+s)*o);
_u=*u;_d=*d;r+=(_u-r)*((_u-_d+s)*q);g+=(_u-g)*((_u-_d+s)*q);b+=(_u-b)*((_u-_d+s)*q);
p->r=(r>=1)?255:r*255;p->g=(g>=1)?255:g*255;p->b=(b>=1)?255:b*255;
}
void main(int u,char** v){
B* a=(B*)malloc(sizeof(B));r_B(a,v[1]);P* p=a->p;int i=a->w*3*a->h;while(i-->0){p_P(p++);}w_B(a, "a.bmp");
}
■ このスレッドは過去ログ倉庫に格納されています