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です。
こちらは、主に報告なので、閉めます。
すみません
一部に誤りがありました。
BitMap操作の部分で、
はじめは
bmpData : TBitmapData;
Map( TMapAccess.Write, bmpData );
としていますが、途中から、
vBitMapData.SetPixel( i, j, pColor );
UnMap( vBitMapData );
の様に、
bmpData --> vBitMapData
と誤って転記していました。
正しくは、vBitMapDataのところもbmpDataです。
失礼しました。
ツイート | ![]() |