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

こん○○は。
BCB5を使ってますが、
高速にビットマップを描画する方法はないでしょうか?
TImage コンポーネントを使用し
Picture->Bitmap->Canvas->Pixels[x][y] へ
SDKから取得したカメラ画像データをTColor RGB(r,g,b)で設定しています。

フォームに画像が表示されるまで1秒ほどかかるためコマ送り状態になっています。

A 回答 (4件)

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ほかの詳細が分からないのであまり自信がありません。
    • good
    • 0

No.1の補足に関して



ぱっと見で仔細に検討してないのですが、

 rgb[i*4+2] = (Byte)ImgData[pnt];
 rgb[i*4+1] = (Byte)ImgData[pnt];
 rgb[i*4+0] = (Byte)ImgData[pnt];

これでかまわないのですか?

この回答への補足

画像データ処理については新参者であり思考錯誤しておるところでもあります。
いろいろネットで調べサンプルを試してますが
この辺のデータコンバートに問題ありでしょうか

補足日時:2005/07/13 00:46
    • good
    • 0

はじめまして。


一般にPixelsは動作が非常に遅いです。
scanlineを使ってください。
    • good
    • 1

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;

補足日時:2005/07/12 15:04
    • good
    • 0

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