このFMX.Types.TBitmap
クラスにはScanLine
FMX (FireMonkey) のプロパティがありますが、このプロパティは削除されたようで、FMX2 (FireMonkey FM2) にはありません。
回避策はありますか? TBitmap
FMX2 でコンテンツに直接アクセスするにはどうすればよいでしょうか?
このFMX.Types.TBitmap
クラスにはScanLine
FMX (FireMonkey) のプロパティがありますが、このプロパティは削除されたようで、FMX2 (FireMonkey FM2) にはありません。
回避策はありますか? TBitmap
FMX2 でコンテンツに直接アクセスするにはどうすればよいでしょうか?
直接アクセスするには、メソッドを使用することが期待されますMap
。ドキュメントには、 FMX.AlphaColorToScanlineなどの多くの例が含まれています。
function TForm1.TestAlphaColorToScanline(ABitmap: TBitmap;
start, count: integer): TBitmap;
var
bitdata1, bitdata2: TBitmapData;
begin
Result := TBitmap.Create(Round(ABitmap.Width), Round(count));
if (ABitmap.Map(TMapAccess.maRead, bitdata1) and
Result.Map(TMapAccess.maWrite, bitdata2)) then
begin
try
AlphaColorToScanline(@PAlphaColorArray(bitdata1.Data)
[start * (bitdata1.Pitch div GetPixelFormatBytes(ABitmap.PixelFormat))],
bitdata2.Data, Round(Result.Height * Result.Width),
ABitmap.PixelFormat);
finally
ABitmap.Unmap(bitdata1);
Result.Unmap(bitdata2);
end;
end;
end;
C++Builder の例を次に示します (現在のドキュメントにはそのようなものが完全にありません)。
int X, Y;
TBitmapData bm;
// get bitmap data access !
if ( Image1->Bitmap->Map(TMapAccess::maReadWrite, bm) )
{
unsigned int* data = (unsigned int*)bm.Data;
// i.e. clear data with alpha color
memset(data, 0,
Image1->Width * Image1->Height * sizeof(unsigned int));
// test direct pixel access here
for (X = 20; X <= 200; X++)
{
for (Y = 10; Y <= 100; Y++)
{
//MyBitmap->Pixels[X][Y] = claLime; // does not work anymore !
bm.SetPixel(X, Y, claLime);
}
}
// now write back the result !
Image1->Bitmap->Unmap(bm);
}
else
{
MessageDlg("Could not map the image data for direct access.",
TMsgDlgType::mtWarning, TMsgDlgButtons() << TMsgDlgBtn::mbOK, 0);
}