1bppファイルを8bpp(raw)に変換する。
環境
Windows7
VS2008 SP1
1bppの画像を8bppに変換しようとしているのですが
うまくいきません。自分ではこれで
合っていると思うのですが・・・
何かアドバイスお願いしますm(__)m
int Main1bppTo8bpp(WCHAR *filename,int width,int height)
{
//width,heightは8bppになったときの幅,高さを指定する。
FILE *fpt;
_wfopen_s(&fpt,filename,L"rb");
if(fpt==0x00)
{
MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK);
return -1;
}
else
{
unsigned char *layer,*Output;
layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char));
Output=(unsigned char*)malloc(width*height);
//読み込み
fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt);
FILE *fpt_output;
_wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb");
int i,j,flag=0x00;
for(i=0;i<((width/8)+1)*height;i+=((width/8)+1))
{
for(j=0;j<((width/8)+1);j++)
{
//8bit目
if((layer[i+j]&BIT8)==BIT8)
{
Output[i+j+flag]=0x00;
}
else
{
Output[i+j+flag]=0xff;
}
//7bit目
if((layer[i+j]&BIT7)==BIT7)
{
Output[i+j+flag+1]=0x00;
}
else
{
Output[i+j+flag+1]=0xff;
}
//6bit目
if((layer[i+j]&BIT6)==BIT6)
{
Output[i+j+flag+2]=0x00;
}
else
{
Output[i+j+flag+2]=0xff;
}
//5bit目
if((layer[i+j]&BIT5)==BIT5)
{
Output[i+j+flag+3]=0x00;
}
else
{
Output[i+j+flag+3]=0xff;
}
//4bit目
if((layer[i+j]&BIT4)==BIT4)
{
Output[i+j+flag+4]=0x00;
}
else
{
Output[i+j+flag+4]=0xff;
}
//3bit目
if((layer[i+j]&BIT3)==BIT3)
{
Output[i+j+flag+5]=0x00;
}
else
{
Output[i+j+flag+5]=0xff;
}
//2bit目
if((layer[i+j]&BIT2)==BIT2)
{
Output[i+j+flag+6]=0x00;
}
else
{
Output[i+j+flag+6]=0xff;
}
//1bit目
if((layer[i+j]&BIT1)==BIT1)
{
Output[i+j+flag+7]=0x00;
}
else
{
Output[i+j+flag+7]=0xff;
}
flag=flag+8;
}
flag=0x00;
}
//最終的な「fwrite」はここでする。
fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output);
free(layer);
free(Output);
fclose(fpt);
fclose(fpt_output);
}
return 0;
お礼
厳密で本質的な御回答ありがとうございます! 参考になります!