Тестовый пример - вычитываю во временый битмап картинку из файла. Потом временный битмап рисую на полотне битмапа от Image1. Потом еще рисую на полотне, например эллипс. На этом этапе все хорошо.
А дальше достаточно сделать Image1.Bitmap.Map - Unmap, и все, изображение пустое. Если писать через BitmapData напрямую в пикселы - оно показывается на экране.
При этом каким-то странным образом эффект стирания битмапа убирается путем вызова Image1.Bitmap.SaveToFile перед вызовом Map-Unmap,
Исходники пытался читать, причины не нашел.
Кто в курсе, подскажите - что я делаю не так?
P.S. Если читать из файла напрямую в Image1.Bitmap - то при Map-Unmap затираются только изменения полотна, а загруженный рисунок остается. Явно какие-то недокументированные особенности вызова Map-Unmap..
P.P.S. Зло где-то в районе вызова
if H.FAccess in [TMapAccess.ReadWrite, TMapAccess.Write] then
SharedDevice.CopyResource(H.Texture, H.FMapBuffer);
при Unmap.
Осталось придумать, как это побороть и совместить рисование на полотне с прямым доступом к пикселам.
procedure TForm2.Button1Click(Sender: TObject);
var Bmp1 : Tbitmap;
BitmapData : TBitmapData;
begin
Bmp1 := Tbitmap.Create;
Bmp1.CreateFromFile('c:\123.bmp');
Image1.Bitmap.Width := Bmp1.Width;
Image1.Bitmap.Height := Bmp1.Height;
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.DrawBitmap(Bmp1,TRectF.Create(0,0,Bmp1.Width,Bmp1.Height),
TRectF.Create(0,0,Image1.Bitmap.Width,Image1.Bitmap.Height), 1);
Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red;
Image1.Bitmap.Canvas.DrawEllipse(TRectF.Create(10, 10,
20,20), 1);
Image1.Bitmap.Canvas.EndScene;
// Image1.Bitmap.SaveToFile('c:\0001.bmp'); //если это закомментировать, то
//при вызове Map-Unmap в Image будет пусто
Image1.Bitmap.Map(TMapAccess.Write,BitmapData);
// здесь была работа с пикселами напрямую - замена цветов в нескольких точках.
Image1.Bitmap.Unmap(BitmapData);
Bmp1.Free;
// BMPTest(Image1.Bitmap);
end;
Вопрос
Vizit0r
Тестовый пример - вычитываю во временый битмап картинку из файла. Потом временный битмап рисую на полотне битмапа от Image1. Потом еще рисую на полотне, например эллипс. На этом этапе все хорошо.
А дальше достаточно сделать Image1.Bitmap.Map - Unmap, и все, изображение пустое. Если писать через BitmapData напрямую в пикселы - оно показывается на экране.
При этом каким-то странным образом эффект стирания битмапа убирается путем вызова Image1.Bitmap.SaveToFile перед вызовом Map-Unmap,
Исходники пытался читать, причины не нашел.
Кто в курсе, подскажите - что я делаю не так?
P.S. Если читать из файла напрямую в Image1.Bitmap - то при Map-Unmap затираются только изменения полотна, а загруженный рисунок остается. Явно какие-то недокументированные особенности вызова Map-Unmap..
P.P.S. Зло где-то в районе вызова
if H.FAccess in [TMapAccess.ReadWrite, TMapAccess.Write] then
SharedDevice.CopyResource(H.Texture, H.FMapBuffer);
при Unmap.
Осталось придумать, как это побороть и совместить рисование на полотне с прямым доступом к пикселам.
procedure TForm2.Button1Click(Sender: TObject); var Bmp1 : Tbitmap; BitmapData : TBitmapData; begin Bmp1 := Tbitmap.Create; Bmp1.CreateFromFile('c:\123.bmp'); Image1.Bitmap.Width := Bmp1.Width; Image1.Bitmap.Height := Bmp1.Height; Image1.Bitmap.Canvas.BeginScene; Image1.Bitmap.Canvas.DrawBitmap(Bmp1,TRectF.Create(0,0,Bmp1.Width,Bmp1.Height), TRectF.Create(0,0,Image1.Bitmap.Width,Image1.Bitmap.Height), 1); Image1.Bitmap.Canvas.Stroke.Color := TAlphaColorRec.Red; Image1.Bitmap.Canvas.DrawEllipse(TRectF.Create(10, 10, 20,20), 1); Image1.Bitmap.Canvas.EndScene; // Image1.Bitmap.SaveToFile('c:\0001.bmp'); //если это закомментировать, то //при вызове Map-Unmap в Image будет пусто Image1.Bitmap.Map(TMapAccess.Write,BitmapData); // здесь была работа с пикселами напрямую - замена цветов в нескольких точках. Image1.Bitmap.Unmap(BitmapData); Bmp1.Free; // BMPTest(Image1.Bitmap); end;
Изменено пользователем Vizit0r3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.