dポイントプレゼントキャンペーン実施中!

http://csharpimage.blog60.fc2.com/blog-entry-18. …
をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、
rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。

24bppのRawファイル(RGB)を拡大縮小しようとしています。
rescale[i+j] =layer[(int)xpos+(int)ypos];の

layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。

layer:24bppRawを読み込むメモリ

アドバイスお願い致します。m(___)m




FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;

// 拡大縮小後の画像サイズ
int hxSize=Common_Data_Raw->width_rescale;
int hySize=Common_Data_Raw->height_rescale;

// 拡大縮小用
int xSize=width;
int ySize=height;
double xpos, ypos;
double hokanX = (double)xSize / hxSize;
double hokanY = (double)ySize / hySize;

unsigned char *layer,*rescale;
//読み込み
layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
fread(&layer[0],sizeof(unsigned char),3*width*height,fpt);

//拡大縮小後のサイズ
rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char));


ypos = 0.0;
for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize)
{
xpos = 0.0;
for (int j=0;j<3*hxSize;j+=3)
{
// 単純補間・間引き
rescale[i+j] =layer[(int)xpos+(int)ypos];
rescale[i+j+1]=layer[(int)xpos, (int)ypos];
rescale[i+j+2]=layer[(int)xpos, (int)ypos];

xpos += hokanX;
}
ypos += hokanY;
}



_wfopen_s(&fpt_output,L"output.raw",L"wb");
fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output);


fclose(fpt);
fclose(fpt_output);
free(layer);
free(rescale);

return 0;

A 回答 (1件)

二次元配列を使っている元のプログラムのrescaleから、一次元配列のこのプログラムにするのにどうしましたか?


rescale[x,y] を rescale[ y * hxsize + x ]にしてますよね?
( 実際には、RGB3プレーン分で 3*(i * hxsize + j)ですが)

同じように、layer[x.y]は layer[y * width +x]です
(同様に3プレーンで3倍です)

注意しなければいけないのは、yposがdoubleである点です。
小数点以下があると、 その分だけ横にずれてしまいます。なので、*widthの前にintにしておく必要があります
rescale[i+j] =layer[((int)xpos+((int)ypos)* width)*3];
rescale[i+j+1] =layer[((int)xpos+((int)ypos)* width)*3+1];
rescale[i+j+2] =layer[((int)xpos+((int)ypos)* width)*3+2];

ちなみに、私なら
・画像の座標の計算をやりやすくために、0≦i<hySize,0≦j<hxSizeにする
・doubleを足していくと誤差がたまるので、その都度xpos,yposを計算する
ということで
for (int i = 0; i < hySize; ++ i)
{
ypos = i * hokanY ;
for (int j=0;j<hxSize; ++ j)
{
// 単純補間・間引き
xpos = j * hokanX;
int rescalep=3*(i * hxSize +j);
int layerp=3*((int)ypos * width+ (int)xpos);
rescale[rescalep] =layer[layerp];
rescale[rescalep+1] =layer[layerp+1];
rescale[rescalep+2] =layer[layerp+2];
}
}
    • good
    • 0
この回答へのお礼

はじめまして!こんにちは!
分かりやすい説明ありがとうございました!!
とってもよくわかりました。><
無事に実装できました☆
ありがとうございます!m(__)m

お礼日時:2010/03/20 12:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A