【问题标题】:how do i Assigning Timage bitmap to jpg correctly?我如何正确地将 Timage 位图分配给 jpg?
【发布时间】:2017-06-20 22:51:08
【问题描述】:

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

【问题讨论】:

  • 你为什么要使用 TImage?那是一个 GUI 控件。
  • 可能是因为图像正在显示给用户。使用 TOpenDialog 的事实意味着正在使用 UI。在任何情况下,TImage2 并不是真正需要的,它可以用一个简单的TBitmap 代替:bmp := TBitmap.Create; try bmp.Width := 50; bmp.Height := 50; bmp.Canvas.StretchDraw(rect(0, 0, 50, 50), image1.Picture.Graphic); ... Jpg.Assign(bmp); ... finally bmp.Free; end;

标签: delphi delphi-10-seattle


【解决方案1】:

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

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

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

使用Bitmap 引用图片对象当它包含位图时。如果图片包含图元文件或图标图形时引用了Bitmap,则该图形将不会被转换(Types of Graphic Objects)。相反,图片的原始内容被丢弃,Bitmap 返回一个新的空白位图

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

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

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

返回与打开或保存对话框的Filter 属性兼容的文件过滤器。

调用GraphicFilter 以获取打开、打开图片、保存图片或保存对话框的Filter 属性值。 GraphicClass 参数可以指定以下值之一:TBitmapTGraphicTIconTMetafile,或TGraphic 的用户定义后代。

例如:

Filter := GraphicFilter(TGraphic);

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

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

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2012-10-09
    • 2022-01-15
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多