FMXでのTBitMapの使い方 その2

解決


yTake  2017-02-12 19:48:45  No: 48543

yTakeです。
失礼しました。ちょっと見ない間に、フォローがあった様です。
一応閉めていましたので、”その2”としました。

KONさん、Mr.XRAYさんのアドバイスなどを参考に、意図する事が実現できました。

要点は二つで、FMXでのTBitMapのPixel毎の操作、作成したBitMapのTImageへの描画、です。

ARY[x、y]は8ビット化した濃度マトリックスのデータでこれをグレイスケールで描画します。

先ず、BitmapのPixel操作ですが、"Map"と"UnMap"を使う様です。
    bmpData : TBitmapData;      操作をするBitMapエリア
    pColor : TAlphaColor;      操作するPixelのカラー
を定義します。

    bmp[i]:=  TBitMap.Create();
    bmp[i].Width :=  x_siz;
    bmp[i].Height:=  y_siz;
    bmp[i].Map( TMapAccess.Write, bmpData );  
    for j := 0 to y_siz - 1 do
    begin
        for i := 0 to x_siz - 1 do
        begin
            grey  :=  ARY[ i, j ];
            pColor :=  grey        +
                       grey shl  8 +
                       grey shl 16 +
                       $FF000000;
            vBitMapData.SetPixel( i, j, pColor );
        end;
    end;
    bmp[i].UnMap( vBitMapData );

Mapはビットマップへのアクセス許可、UnMapはビットマップ変更の確定、bmpDataは許可されたビットマップ、pColorは操作する色(アルファ含む)、TMapAccessはアクセスモード(read/Write/ReadWrite)

VCLの時はビットマップのPixelへ直接操作が可能で、Map/UnMapなどの処理は不要でした。

次にTImageへの描画ですが、こちらもVCLから変更があった様です。

VCLの時は、
Image.Canvas.StrechDrawで実現出来ていました。

FMXでは、BeginScene、EndSceneを使う様です。
srcRect : TRectF;  元画像の矩形範囲(実数で4点を指定)
dstRect : TRectF;  表示先の矩形範囲(実数で4点を指定)

Image.Bitmap.Canvas.BeginScene;      描画開始
Image.Bitmap.Canvas.DrawBitmap(bmp[i],srcRect,dstRect,1);描画のコピー
Image.Bitmap.Canvas.EndScene;        描画終了

ただ、Helpのサンプルでは、EndSceneの後、"BitmapChanged"を使っていましたが、同じ様にすると"Bitmap.Changedという名前のメンバを含んでいません"となりました。
実際には、Mr.XRAYさんからのサンプルにもあります様に、"BitmapChanged"を使わなくても問題ない様でした。

なお、前回の問い合わせの最後で、ImageにBitmapが描画されなかった点は、アルファチャンネルカラーの設定($FF000000)と誤:Image.Canvas、正Image.Bitmap.Canvasのアクセス方法に誤りがあった為と思います。

確認と報告が遅れました。

上述、報告させて頂きます。


yTake  2017-02-14 03:15:23  No: 48544

yTakeです。

こちらは、主に報告なので、閉めます。


yTake  2017-02-19 19:25:23  No: 48545

すみません
一部に誤りがありました。

BitMap操作の部分で、

はじめは
bmpData : TBitmapData;
Map( TMapAccess.Write, bmpData );
としていますが、途中から、
vBitMapData.SetPixel( i, j, pColor );
UnMap( vBitMapData );
の様に、
bmpData --> vBitMapData
と誤って転記していました。
正しくは、vBitMapDataのところもbmpDataです。

失礼しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加