- 締切済み
ビットマップの描画方法
こん○○は。 BCB5を使ってますが、 高速にビットマップを描画する方法はないでしょうか? TImage コンポーネントを使用し Picture->Bitmap->Canvas->Pixels[x][y] へ SDKから取得したカメラ画像データをTColor RGB(r,g,b)で設定しています。 フォームに画像が表示されるまで1秒ほどかかるためコマ送り状態になっています。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- KoHal
- ベストアンサー率60% (110/181)
No.3に引用したコードだとImgData[pnt]の先頭バイトをそのまま3回コピーしてますよね。 ImgDataも32ビットマップデータということですから、ImgData[pnt]から始まる32ビット=4バイト(または4バイト目は省略して3バイト)をコピーする必要があるのではないでしょうか? for( int j=0 ; j<pBitmap->Height; j++ ){ Byte *rgb = (Byte *)pBitmap->ScanLine[j]; for(int i=0;i<pBitmap->Width;i++){ int pnt = j * pBitmap->Width + i;//pntはintですね? memcpy( &rgb[i*4], &ImgData[pnt], 3 );//コピーするのは3バイトにしてます } } ImgDataが配列またはポインタならポインタ演算を使ったほうがすっきりするかもしれません。 for( int j=0 ; j<pBitmap->Height; j++ ){ Byte *rgb = (Byte *)pBitmap->ScanLine[j]; Byte *src = (Byte *)(ImgData + j * pBitmap->Width); for(int i=0;i<pBitmap->Width;i++){ memcpy( rgb, src, 3 ); rgb+=4, src+=4; } } あと、蛇足ですが、効率を考えるならpBitmapはフォームメンバにするかして一度だけnew/deleteするようにしたほうがいいですね。 以上ImgDataほかの詳細が分からないのであまり自信がありません。
- KoHal
- ベストアンサー率60% (110/181)
No.1の補足に関して ぱっと見で仔細に検討してないのですが、 rgb[i*4+2] = (Byte)ImgData[pnt]; rgb[i*4+1] = (Byte)ImgData[pnt]; rgb[i*4+0] = (Byte)ImgData[pnt]; これでかまわないのですか?
- lachesis-r
- ベストアンサー率56% (28/50)
はじめまして。 一般にPixelsは動作が非常に遅いです。 scanlineを使ってください。
- KoHal
- ベストアンサー率60% (110/181)
TImageへの書き込みはかなりのオーバーヘッドが生じます。 とりあえず書込み用のTBitmapを用意して、そこに画面1枚書込んだところでTImageに反映させるようにしてみて下さい。 それだけであるていど改善されると思います。
補足
TBitmapを用意しScanLineへ書き込みTImageに反映させてみました。 カメラの移動に対しスムーズに反応はしてますが、表示画像全体がグレーの網掛けになっています。 取り込む画像データ( ImgData[ ] )は、32bitsビットマップデータのデータ部と同じ形式です。 データの扱いに問題ありでしょうか? Graphics::TBitmap *pBitmap; pBitmap = new Graphics::TBitmap(); pBitmap->Width = 680; pBitmap->Height = 512; pBitmap->PixelFormat = pf32bit; for( int j=0 ; j<pBitmap->Height; j++ ){ Byte *rgb = (Byte *)pBitmap->ScanLine[j]; for(int i=0;i<pBitmap->Width;i++){ pnt = j * pBitmap->Width + i; rgb[i*4+2] = (Byte)ImgData[pnt]; rgb[i*4+1] = (Byte)ImgData[pnt]; rgb[i*4+0] = (Byte)ImgData[pnt]; } } pImage->Canvas->Draw( 0 , 0 , pBitmap ); pImage->Refresh(); delete pBitmap;
補足
画像データ処理については新参者であり思考錯誤しておるところでもあります。 いろいろネットで調べサンプルを試してますが この辺のデータコンバートに問題ありでしょうか