在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;
有关如何解决此问题的任何想法都会非常有用。
我们尝试过:
查看了FMX.Graphics中的CreateThumbnail
代码,但我们看到的任何内容都无法更改以修补此问题。
答案 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;