アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもこちらでお世話になっております。
現在OpenCVをつかって画像処理を行なっています。言語はVC++です。
OpenCVで処理した画像をPictureBoxに表示させたいのですが、
うまく表示できません。
IplImageをBmpに変換させる部分がおかしいとは思うのですが…

//--------------------------------------------------------
IplImage *img;
img = cvLoadImage(filename, 0); // 0: グレイスケールで読み込む
cvThreshold(img,img, 70, 255, CV_THRESH_BINARY_INV);//二値化

// ビットマップ用のカラーバッファ
char* ColorBuf = (char*)calloc( sizeof(char), img->width * img->height * 4 );
for( int y = 0; y < img->height; y++ ) {
for( int x = 0; x < img->width; x++ ) {
// Blue
ColorBuf[ y * img->width + x * 4 + 0 ] =
img->imageData[ y * img->widthStep + x * 3 + 0 ];
// Green
ColorBuf[ y * img->width + x * 4 + 1 ] =
img->imageData[ y * img->widthStep + x * 3 + 1 ];
// Red
ColorBuf[ y * img->width + x * 4 + 2 ] =
img->imageData[ y * img->widthStep + x * 3 + 2 ];
}
}
mbmp.CreateBitmap( img->width, img->height, 1, 32, ColorBuf );
free( ColorBuf );

((CStatic*)GetDlgItem( IDC_IMGSRC ))->SetBitmap ( mbmp );

myDC.CreateCompatibleDC(pDC);
CBitmap *oldBMP = myDC.SelectObject(&mbmp);
pDC->BitBlt(0,0,300,300,&myDC,0,0,SRCCOPY);
myDC.SelectObject(oldBMP);

cvReleaseImage( &img );

//-----------------------------------------------

PictureBoxのリソースIDをIDC_IMGSRCに設定しています。
今はPictureBoxの上部に画像が4つ並んでしまっている状態です。

なにか改善すべきところがありましたらよろしくお願いいたします。

A 回答 (1件)

> myDC.CreateCompatibleDC(pDC);


> CBitmap *oldBMP = myDC.SelectObject(&mbmp);
> pDC->BitBlt(0,0,300,300,&myDC,0,0,SRCCOPY);
> myDC.SelectObject(oldBMP);
が不要に思います

mbmpはメンバー変数なんですよね ・・・

グレースケールで読み込んでいるのですからimgのデータは512x512しかありません
ビットマップデーを構築する部分は
ColorBuf[ y * img->width * 4 + x * 4 + 0 ] =
img->imageData[ y * img->widthStep + x * 3 + 0 ];
ColorBuf[ y * img->width * 4 + x * 4 + 2 ] = ColorBuf[ y * img->width * 4 + x * 4 + 1 ] = ColorBuf[ y * img->width * 4 + x * 4 + 0 ];
といった具合でしょう
y軸の計算に 幅だけでなく 1ピクセル分のバッファも乗算しましょう

この回答への補足

早速の回答ありがとうございます。

前表示されたものよりよい感じに表示されるのですが、
次はPictureBoxにたて3つの画像が表示されてしまいます。
解決策などありましたらよろしくお願いいたします。

補足日時:2008/10/24 12:04
    • good
    • 0

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