XE7 FMX损坏了PNG缩略图

时间:2014-12-23 22:28:15

标签: delphi png firemonkey delphi-xe7

在XE7-Update1 FMX Windows7-64bit中遇到创建缩略图的问题。 XE5中不存在此问题。

我在FMX HD表格上有三个TImage组件,一个按钮和一个TOpenDialog组件。

使用TOpenDialog我选择一个已在Photoshop / Corel中测试过的现有PNG,看起来不错。图像在Image1中正确显示。

在运行时,我使用Image1.Bitmap.CreateThumbnail创建两个缩略图,并将结果分配给Image2和Image3。在XE7上Image2和Image3的背景已损坏,表单的随机部分。使用XE5,一切运行良好。

当我重复这个过程(在Image1中加载PNG ...创建缩略图和显示)时,损坏会增加。

保存到文件时存在损坏的背景。

以下是代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  FormShow(nil);
end;

procedure TForm1.FormShow(Sender: TObject);
var
  thumbX, thumbY : Integer;
  SaveParams: TBitmapCodecSaveParams;
  thumb1, thumb2 : TBitmap;
begin
  if OpenDialog1.Execute then
  begin
    Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
    try        
      thumbX := Round(Image1.Width / 4);
      thumbY := Round(Image1.Height / 4);
      thumb1 := Image1.Bitmap.CreateThumbnail(thumbX, thumbY);
      Image2.Bitmap.SetSize(thumbX, thumbY); //this has no impact
      Image2.Bitmap.Assign(thumb1);
    finally
      thumb1.free;
    end;

    try
      thumbX := Round(Image1.Width / 2);
      thumbY := Round(Image1.Height /2);
      thumb2 := Image1.Bitmap.CreateThumbnail(thumbX, thumbY);
      Image3.Bitmap.SetSize(thumbX, thumbY); //this has no impact
      Image3.Bitmap.Assign(thumb2);
    finally
      thumb2.Free;   
    end;

    SaveParams.Quality := 100;
    Image2.Bitmap.SaveToFile('c:\blackdot\image_quarter.png', @SaveParams);
    Image3.Bitmap.SaveToFile('c:\blackdot\image_half.png', @SaveParams);
  end;
end;

有关如何解决此问题的任何想法都会非常有用。

我们尝试过:

  1. 无效
  2. 在分配缩略图之前设置image2,image3的大小
  3. 在分配缩略图之前清除image2,image3
  4. 查看了FMX.Graphics中的CreateThumbnail代码,但我们看到的任何内容都无法更改以修补此问题。

2 个答案:

答案 0 :(得分:1)

这肯定是一个大错误。我拿了示例代码并自己尝试了。
结果:
1)Image2不能很好地缩放,并且总是与Image3的大小相同
2)经过3次尝试后,Image2由两个叠加的图像组成:前面是第三次尝试的图像,后面是第一次尝试的图像。

该过程是可重复的,图像的选择也无关紧要

答案 1 :(得分:1)

由于看起来这是XE7的一个错误,我采用了另一种似乎在测试代码中起作用的方法。我没有用TBitmap.CreateThumbnail创建拇指,而是使用TBitmap.LoadThumbnailFromFile创建拇指,传递所需的拇指宽度和高度。我想在真正的应用程序中,我们可以直接在可视组件中加载拇指,而不是在运行时创建TBitmaps。

虽然这种方法反复从磁盘加载文件,但它允许我们继续我们的应用程序开发。使用测试代码,我可以重复加载可视化的图像并正确保存到文件中。

var
   thumbX, thumbY : Integer;
   SaveParams: TBitmapCodecSaveParams;
   thumb1, thumb2 : TBitmap;
begin
     if OpenDialog1.Execute then
     begin
       Image1.Bitmap.LoadFromFile(OpenDialog1.FileName);

         thumbX := Round(Image1.Width / 4);
         thumbY := Round(Image1.Height / 4);
         //thumb1 := Image1.Bitmap.CreateThumbnail(thumbX, thumbY);
         thumb1 := TBitmap.Create;
       try
         thumb1.LoadThumbnailFromFile(OpenDialog1.FileName, thumbX, thumbY);
         thumb1.SaveToFile('c:\blackdot\thumb1.png');  //just to compare with our visual components
         Image2.Bitmap.SetSize(thumbX, thumbY);
         Image2.Bitmap.Assign(thumb1);
       finally
         thumb1.Free;
       end;


         thumbX := Round(Image1.Width / 2);
         thumbY := Round(Image1.Height /2);
         //thumb2 := Image1.Bitmap.CreateThumbnail(thumbX, thumbY);
         thumb2 := TBitmap.Create;
       try
         thumb2.LoadThumbnailFromFile(OpenDialog1.FileName, thumbX, thumbY);
         thumb2.SaveToFile('c:\blackdot\thumb2.png');  //just to compare with our visual components
         Image3.Bitmap.SetSize(thumbX, thumbY);
         Image3.Bitmap.Assign(thumb2);
       finally
         thumb2.Free;
       end;

       SaveParams.Quality := 100;
       Image2.Bitmap.SaveToFile('c:\blackdot\image_quarter.png', @SaveParams);
       Image3.Bitmap.SaveToFile('c:\blackdot\image_half.png', @SaveParams);

     end;
end;