gpt4 book ai didi

delphi - 如何正确将 Timage 位图分配给 jpg?

转载 作者:行者123 更新时间:2023-12-03 15:51:30 28 4
gpt4 key购买 nike

我正在执行以下操作来调整 Timage 图形的大小并将其另存为 jpg 。图像保存为空白。

这是我分配 Timage 的方法

begin
with TOpenDialog.Create(self) do
try
Caption := 'Open Image';
Options := [ofPathMustExist, ofFileMustExist];
Filter := 'JPEG Image File (*.jpg)|*.jpg|JPEG Image File (*.jpeg)|*.jpeg|Bitmaps (*.bmp)|*.bmp';
if Execute then
image1.Picture.LoadFromFile(FileName);
finally
Free;
end;
end;

这是我如何调整 timage 的大小并将其分配为 jpg 。

 with Image2.Canvas do begin
Lock;
try
try
Image2.Picture.Graphic.Width := 50;
Image2.Picture.Graphic.Height := 50;
FillRect(ClipRect);
StretchDraw(rect(0, 0, 50, 50), image1.Picture.Bitmap);
except
on E: Exception do
//log

end;
finally
Unlock;
end;
end;




Jpg := TJPEGImage.Create;
try

Jpg.Performance := jpBestSpeed;
Jpg.ProgressiveEncoding := True;
Jpg.ProgressiveDisplay := True;
Jpg.Assign(image2.Picture.Bitmap);
Jpg.CompressionQuality := 90;
Jpg.Compress;
jpg.SaveToFile('screena.jpg');



finally
Jpg.Free;
end;

保存的 jpg 变成空白我做错了什么?我需要做的就是将图像从磁盘加载到 Timage 然后调整宽度和高度并再次将其分配为 jpg

最佳答案

您的图像为空白的原因是您在将 Image1 绘制到 Image2 的 Canvas 上时使用了 Picture.Bitmap 属性:

StretchDraw(rect(0, 0, 50, 50), image1.Picture.Bitmap);

如果您尚未将 .bmp 文件加载到 Image1 中,则访问 Bitmap 属性将清除当前图像并将其替换为空白图像。这是documented behavior :

Use Bitmap to reference the picture object when it contains a bitmap. If Bitmap is referenced when the picture contains a Metafile or Icon graphic, the graphic won't be converted (Types of Graphic Objects). Instead, the original contents of the picture are discarded and Bitmap returns a new, blank bitmap.

TCanvas.StretchDraw()方法在其第三个参数中接受任何 TGraphic 对象。您应该传入 Picture.Graphic 属性而不是 Picture.Bitmap 属性:

StretchDraw(rect(0, 0, 50, 50), image1.Picture.Graphic);
<小时/>

附注:在分配 TOpenDialog.Filter 属性时,请考虑使用 VCL 的 GraphicFilter() Graphics 单元中的函数:

Returns a file filter compatible with the Filter property of an Open or Save dialog.

Call GraphicFilter to obtain a value for the Filter property of an Open, Open Picture, Save Picture or Save dialog box. The GraphicClass parameter can specify one of these values: TBitmap, TGraphic, TIcon, TMetafile, or a user-defined descendant of TGraphic.

例如:

Filter := GraphicFilter(TGraphic);

如果您要手动填充过滤器,那么至少不要为不同的 JPEG 扩展名设置单独的条目。将它们组合在一个条目中,例如:

Filter  := 'JPEG Images (*.jpg, *.jpeg)|*.JPG;*.JPEG|Bitmap Images (*.bmp)|*.BMP';

关于delphi - 如何正确将 Timage 位图分配给 jpg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44664201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com