ScanLine


目次に戻る


昨日紹介したBitBltがあまり高速で無かったので、VCLのTBitmapのScanLineプロパティ を紹介します。残念ながらBuilderのバージョン3だったか4以上じゃないと動きません。
 
TBitmap::ScanLineはWindowsでサポートされるDIBを使いやすくした物で、Bitmap間 の読み書きを高速にする。あくまでBitmap間でしか処理ができないので、Canvasに描画 したいときなどはBitBltやCopyRect、Draw等を使用する必要がある。
int alinesize;    // 一行コピーしたいときに必要なバイト数

// コピーもとのビットマップ
Graphics::TBitmap *sbit = new Graphics::TBitmap();
sbit->LoadFromFile( "c:\\work\\test.bmp" );

// コピー先のビットマップ
Graphics::TBitmap *dbit = new Graphics::TBitmap();
dbit->Width = sbit->Width;
dbit->Height = sbit->Height;
dbit->PixelFormat = sbit->PixelFormat;

switch( sbit->PixelFormat ){
    case pf8bit:
        alinesize = sbit->Width;
        break;
    case pf24bit:
        alinesize = sbit->Width * 3;
        break;
    default:
        // サポートしていない
        alinesize = 0;
        break;
}

for( int y=0 ; y<sbit->Height; y++ ){
    memcpy( dbit->ScanLine[y] , sbit->ScanLine[y] , alinesize );
}

PaintBox1->Canvas->Draw( 0 , 0 , dbit );

delete dbit;
delete sbit;

256色か24bitのフルカラーのビットマップに対応しています。それ以外のものは駄目です 。また、256色の場合、パレットのコピーを行っていないので色化けを起こすと思います。

目次に戻る