電子書籍の厳選無料作品が豊富!

こんばんは!

Windows環境,VS2005で放射状ブラーを以下の様に書きましたが、
結果が添付ファイルの様になってしまい、うまくいきません。
コンパイルは通り実行もできるのですが、結果がうまくいっていないのです。(いろんな画像で試しましたが明らかに
うまくいっていない気がするのです)
参考にしたのは、
http://www.sbcr.jp/books/download/art.asp?newsid …

" 第3章 エフェクト処理の応用(その1) IPP_Chap3a.zipの中にある
list3_14.cです。
又、web上では、http://d.hatena.ne.jp/matsu4512/20090726/1248575 …
参考にしました。

以下が私が書いたものです。Input=24bppのrawファイル名
幅、高さが入った構造体です。
プログラミング思想としては、1次元配列で画像を表しています。



#define NN 17
#define NF 8
int Main24bppToRadialBlur(COMMONDATA *Common_Data_Raw)
{
FILE *fpt;
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
int i;
unsigned char *layer,*img_output;
int rr,gg,bb,oo;

int x1=0;
int y1=0;
int x2=3*width-3;
int y2=3*width*height-3*width;
WCHAR DebugStr[256];

double ox,oy;

ox=(double)(x2-x1)/2.0;
oy=(double)(y2-y1)/2.0;

double dx,dy;

dx=(double)x2-ox;
dy=(double)y2-oy;

double disMAX;
disMAX=sqrt(dx*dx+dy*dy);

int x,y;
int xx,yy;
double rate,rad=0,dis,disI;
int pat_sum,pat;

double ef=30.0;





_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
//読み込み
fread(&layer[0],sizeof(unsigned char),3*width*height,fpt);

img_output=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));

//◆画像処理をするスペース
for(y=y1;y<=3*width*height-3*width;y+=3*width)
{
for(x=x1;x<=3*width-3;x+=3)
{
rr=gg=bb=oo=0;
dx=(double)x-ox;
dy=(double)y-oy;
if(dx!=0.0)
{
rad=atan(dy/dx);

}
else
{
rad=3.14159265/2.0;
}

//rad+=(3.14159265/2.0);
dis=sqrt(dx*dx+dy*dy);
rate=ef*dis/disMAX;
rate/=((double)NF);
pat_sum=0;

for(i=0;i<NN;i++)
{
if(i==NF)
{
pat=3;
}
else
{
pat=1;
}

disI=(double)(i-NF)*rate;
xx=(int)(disI*cos(rad))+x;
yy=(int)(disI*sin(rad))+y;

rr+=layer[xx+yy] * pat;
gg+=layer[xx+yy+1]* pat;
bb+=layer[xx+yy+2]* pat;
oo+= pat;
pat_sum+=pat;
}

img_output[x+y]=rr/(oo);
img_output[x+y+1]=gg/(oo);
img_output[x+y+2]=bb/(oo);
}//x

}//y



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


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

「放射状ブラー C言語で書いたのですが結果」の質問画像

A 回答 (1件)

座標と配列アクセスのインデックスの取り扱いが混乱しているようです。


x, yの座標は基本的に 0~width-1, 0~height-1 のままで扱って、layer[]とimg_output[]をアクセスするときだけインデックスを計算してください。
    • good
    • 0
この回答へのお礼

こんばんは!
的確なアドバイスありがとうございました☆
無事に実装できました!!!!!うれしいです!!

お礼日時:2010/04/05 23:02

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