プロが教えるわが家の防犯対策術!

VC++でjpgを読み込んで縮小してモノクロに表示するプログラムを作成しています。画像を走査するときに、あとで使う予定なのでグローバル変数pixに座標と画像の番号と濃度値を保存して、縮小されたモノクロ画像はちゃんと作画されるのですが(縮小化を行う関数内では濃度値も正しい)、別の関数で濃度値を参照すると値がすべて「0」になります。アドバイスいただけたら幸いです。

ヘッダー内での宣言
public:
short int pix[490464];

メインダイアログのソース抜粋
void CxxxxxxxxxDlg::Load(int pictbox);
CImage img_org, img_little;
CBitmap *myBMP;
CDC *pDC = m_pict11.GetDC();
CDC myDC;
int x, y;
COLORREF col;
CString buf;
int thr;
m_thrmono.GetWindowTextA(buf);
thr = atoi(buf);

img_org.Load(jpgファイル絶対パス);

img_little.Create(234, 160, 24, 0);

for(y=0; y<(img_little.GetHeight()); y++){
for(x=0; x<(img_little.GetWidth()); x++){
col = img_org.GetPixel((int)(x*3),(int)(y*3));
pix[x,y,pictbox] = GetRValue(col);
if(pix[x,y,pictbox]>thr){
pix[x,y,pictbox] = 255;
}else{
pix[x,y,pictbox] = 0;
}
img_little.SetPixel(x, y, RGB((pix[x,y,pictbox]),(pix[x,y,pictbox]),(pix[x,y,pictbox])));
buf.Format("x:%d y:%d pix:%d", x, y, pix[x,y,pictbox]);
m_display.AddString(buf);
}
}
(ピクチャーコントロールへの作画)

}


int CyyyyyyyyyyyDlg::Recog(int pictbox){
CString buf;

for(int y=0; y<160; y++){
for(int x=0; x<234; x++){
buf.Format("pict%d x:%d y:%d -> %d", pictbox, x, y, pix[x,y,pictbox]);
m_display.AddString(buf);
}
}

return distance;
}

上の関数でリストボックス(コントロール変数m_display)には0か255が入っているのですが、下の関数ではリストにはすべて0になってしまいます。

A 回答 (1件)

配列へのアクセスの仕方が問題だと思いますよ


pix[x,y,pictbox] ですと 左から順に評価して最終的に pictboxの値で評価されたインデックスの値がとられると思います

単色のxyでデータを集めたいのであれば
char pix[160][234];
といった宣言をしておいて
pix[y][x]としてアクセスしましょう

RGBでデータを集めるなら
char pix[160][234][3];
などといった具合にします
    • good
    • 0
この回答へのお礼

解決しました!!こんな宣言の方法があったんですね。左から評価されるのも知りませんでした。
今、自分の質問を読み返すと添削が不十分なソースですが、こんな質問に的確に答えていただき、本当にありがとうございました。

お礼日時:2007/11/19 22:41

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