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;
Другие вопросы по тегам