我如何正确地将Timage位图分配给jpg?

时间:2017-06-20 22:51:08

标签: delphi delphi-10-seattle

我正在执行以下操作来调整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

1 个答案:

答案 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参数可以指定其中一个值:TBitmapTGraphicTIconTMetafileTGraphic的用户定义后代。

例如:

Filter := GraphicFilter(TGraphic);

如果您要手动填充Filter,那么至少不要为不同的JPEG扩展分别添加条目。将它们组合在一个条目中,例如:

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