Вы должны создать TBitmap
и присвоить ему Picture.Graphic
:
procedure TForm3.btnSaveClick(Sender: TObject);
var
bm: TBitmap;
begin
bm := TBitmap.Create;
try
bm.Assign(Image1.Picture.Graphic);
bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\bitmap.bmp');
finally
bm.Free;
end;
end;
Ваш подход:
Image1.Picture.Bitmap.SaveToFile('Y:\Downloads\test.bmp');
не работает, потому что Picture
не Не содержит растрового изображения. Из документации свойства TPicture.Bitmap
:
Используйте Bitmap для ссылки на объект изображения , если он содержит растровое изображение . Если используется ссылка на Bitmap, когда изображение содержит метафайл или значок graphi c, графический файл c не будет преобразован (типы Graphi c Objects). Вместо этого исходное содержимое изображения отбрасывается , а Bitmap возвращает новое пустое растровое изображение.
Этот подход:
Image1.Picture.SaveToFile('Y:\Downloads\test.bmp');
делает именно то, что он должен делать. Он сохраняет Picture.Graphic
как есть, которое в вашем случае является изображением PNG, в указанный вами файл. Вы выбрали странное расширение для изображения PNG, но VCL не пытается это исправить.
Обработка прозрачности PNG
Если файл PNG имеет альфа-канал, bm.Assign
будет очень точно создать растровое изображение с альфа-каналом. В каком-то смысле это здорово, потому что тогда вы не теряете никакой информации: полученный вами BMP содержит все графические c данные из PNG, включая весь альфа-канал. Так что, в принципе, вы можете визуализировать этот BMP на любом фоне, и он будет выглядеть так же красиво, как и PNG.
Но с другой стороны, в конце концов, это не так уж и хорошо. Потому что почти никакие программы просмотра изображений или редакторы не поддерживают BMP с альфа-каналами. Эти приложения, вероятно, будут игнорировать альфа-канал, фактически делая каждый пиксель полностью непрозрачным. Это будет выглядеть ужасно.
Итак, если вы хотите создать обычный BMP без альфа-канала, вам нужно «визуализировать» PNG, используя его альфа-канал, на выбранном фоне, а затем сохранить непрозрачный результат. BMP, который вы получите, не будет содержать альфа-канал исходного PNG, поэтому вы потеряете информацию. BMP не будет прозрачным. Например, если вы рисуете его на белом фоне, у вас всегда будет этот белый прямоугольник позади вашего значка / объекта, даже если вы поместите его в красную область экрана.
procedure TForm3.Image1Click(Sender: TObject);
var
bm: TBitmap;
begin
bm := TBitmap.Create;
try
bm.SetSize(Image1.Picture.Width, Image1.Picture.Height);
bm.Canvas.Brush.Color := clSkyBlue; {*}
bm.Canvas.FillRect(Rect(0, 0, bm.Width, bm.Height)); {*}
bm.Canvas.Draw(0, 0, Image1.Picture.Graphic);
bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\bitmap2_1.bmp');
finally
bm.Free;
end;
end;
Линии с звездочки (*) можно опустить, если вас устраивает белый цвет фона по умолчанию.