我正在执行以下操作来调整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
答案 0 :(得分:4)
图片空白的原因是因为您在Picture.Bitmap
的画布上绘制Image1
时使用了Image2
属性:
StretchDraw(rect(0, 0, 50, 50), image1.Picture.Bitmap);
如果您尚未将.bmp
文件加载到Image1
,则访问Bitmap
属性将清除当前图像并将其替换为空白图像。这是documented behavior:
使用
Bitmap
引用包含位图的图片对象 。如果图片包含图元文件或图标图片时引用Bitmap
,图片将无法转换(Types of Graphic Objects)。相反,图片的原始内容将被丢弃,Bitmap
会返回一个新的空白位图。
TCanvas.StretchDraw()
方法接受第3个参数中的任何TGraphic
个对象。您应该传递Picture.Graphic
属性而不是Picture.Bitmap
属性:
StretchDraw(rect(0, 0, 50, 50), image1.Picture.Graphic);
旁注:分配TOpenDialog.Filter
属性时,请考虑使用Graphics
单元中的VCL GraphicFilter()
功能:
返回与“打开”或“保存”对话框的
Filter
属性兼容的文件过滤器。调用
GraphicFilter
以获取打开,打开图片,保存图片或保存对话框的Filter
属性的值。GraphicClass
参数可以指定其中一个值:TBitmap
,TGraphic
,TIcon
,TMetafile
或TGraphic
的用户定义后代。
例如:
Filter := GraphicFilter(TGraphic);
如果您要手动填充Filter
,那么至少不要为不同的JPEG扩展分别添加条目。将它们组合在一个条目中,例如:
Filter := 'JPEG Images (*.jpg, *.jpeg)|*.JPG;*.JPEG|Bitmap Images (*.bmp)|*.BMP';