XE7 FMX поврежденные картинки PNG
Возникли проблемы при создании эскизов в XE7-Update1 FMX Windows7-64bit. Эта проблема отсутствует в XE5.
У меня есть три компонента Timage, одна кнопка и компонент TOpenDialog в форме FMX HD.
С TOpenDialog я выбираю существующий PNG, который был протестирован в Photoshop/Corel и кажется хорошим. Изображение отображается правильно в TImage1.
Во время выполнения я создаю два эскиза, используя Image1.Bitmap.CreateThunbnail и назначаю результат для Image2 и Image3. На XE7 Image2 и Image3 имеет поврежденный фон со случайными участками формы. С XE5 все работает хорошо.
Повреждение увеличивается, когда я повторяю процесс (загрузите PNG в Image1... создайте эскизы и отобразите).
Поврежденный фон присутствует при сохранении в файл.
Вот код:
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 перед назначением миниатюры
Посмотрел код createthumbnail в FMX.Graphics, но там нет ничего особенного, что мы можем изменить, чтобы исправить эту проблему.
2 ответа
Это, безусловно, большая ошибка. Я взял пример кода и попробовал сам.
Результаты:
1) Image2 плохо масштабируется и всегда имеет тот же размер, что и Image3
2) После 3 попыток Image2 состоит из двух наложенных изображений: спереди - изображение с третьей попытки, а сзади - изображение с первой попытки.
Процесс повторяется и выбор изображений тоже не актуален
Поскольку кажется, что это ошибка в 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;