Перейти к содержанию
Fire Monkey от А до Я
  • 0

"Шум" на прозрачном фоне PNG при TBitmap.CreateThumbnail


enatechno

Вопрос

1). Скачиваю картинки с сайта
2). Уменьшаю "на лету" с помощью TBitmap.CreateThumbnail.
3). Отображаю в каком-нибудь контроле
4.) Сохраняю на диск Thumbnail картинки (кэширую).

 

Обнаружил проблему во втором пункте. Сначала только на мобильных платформах, а потом и в Windows.
Суть проблемы:  При использовании CreateThumbnail  для PNG-файлов с прозрачным фоном случайным образом на прозрачном фоне возникает "шум".
В примере воссоздал этот пункт tstGetThumb.zip.
Так должно быть:

post-324-0-34133900-1447257964.png

Так "шумит" в Windows (например если нажать Fill-Clear-Fill)

post-324-0-83868300-1447257964.pngpost-324-0-31225600-1447257965.png


Так "шумит" в iOS simulator

post-324-0-40324700-1447257963.pngpost-324-0-90584800-1447257963.png

Аналогичная ситуация и на мобильных устройствах.

Временно решил эту проблему заменив пункт 2 на:
2a). Сохраняю исходную(большую) картинку на диск
2б). Считываю уменьшенную картинку с помощью TBitmap. LoadThumbnailFromFile с диска.
В этом случае шума нет. Но при большом количестве и размере картинок происходит торможение программы.

 

Кто-нибудь сталкивался с подобной проблемой? М.б. я не правильно использую CreateThumbnail? 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

попробуй вместо присваивание зануленому битмапу сначало создать его с нужными размерами залить белым или прозрачным цветом где только альфа, а потом уже присвоить картинку через ассигн.

Ссылка на комментарий
  • 0

попробуй вместо присваивание зануленому битмапу сначало создать его с нужными размерами залить белым или прозрачным цветом где только альфа, а потом уже присвоить картинку через ассигн.

      ABitmap := TBitmap.Create(AFitWidth, AFitHeight);
      ABitmap.Clear(claNull);
      try
        ABitmap.LoadFromStream(AStream);
        AThumbBitmap := ABitmap.CreateThumbnail(AFitWidth, AFitHeight);
        try
          AImage := FindComponent('Image' + I.ToString) as TImage;
          if Assigned(AImage) then
          begin
            AImage.Bitmap.Clear(claNull);
            AImage.Bitmap.Assign(AThumbBitmap);
          end;

Так? Не помогает. 

Если выполнить AThumbBitmap := ABitmap.CreateThumbnail(AFitWidth, AFitHeight);

а затем сразу сохранить AThumbBitmap на диск, то на диске он уже с шумом.

Ссылка на комментарий
  • 0

нет

 

AThumbBitmap := TBitmap.Create(AFitWidth, AFitHeight);
AThumbBitmap.Clear(claNull);

AThumbBitmap.Assign(ABitmap.CreateThumbnail(AFitWidth, AFitHeight));

 

грязь может быть именно в AThumbBitmap

Изменено пользователем haword
Ссылка на комментарий
  • 0

проблема не обнаружилась

На мобильных устройствах тоже? С прикрепленным примером у меня описанная проблема наблюдается и на XE7 и на 10 Seattle. На Windows - ошибка плавающая. Но если нажать поочередно Fill и Clear несколько раз, то "шум" можно увидеть. Или может у Вас есть изменения в исходниках delphi?

 

AThumbBitmap := TBitmap.Create(AFitWidth, AFitHeight);

AThumbBitmap.Clear(claNull);

AThumbBitmap.Assign(ABitmap.CreateThumbnail(AFitWidth, AFitHeight));

К сожалению тоже не помогло.

Для тех кто правит исходники могу порекомендовать добавить в FMX.Graphics  после создания Bitmap для Thumbnail строку Result.Clear(claNull);

Мне помогло.

 

function TBitmap.CreateThumbnail(const AWidth, AHeight: Integer): TBitmap;
var
  FitRect: TRectF;
begin
  Result := TBitmap.Create(AWidth, AHeight);
  Result.Clear(claNull); // <-- добавлена очистка 
  if not IsEmpty and Result.Canvas.BeginScene then
  ......
Ссылка на комментарий
  • 0
  • Модераторы
На мобильных устройствах тоже? С прикрепленным примером у меня описанная проблема наблюдается и на XE7 и на 10 Seattle. На Windows - ошибка плавающая. Но если нажать поочередно Fill и Clear несколько раз, то "шум" можно увидеть. Или может у Вас есть изменения в исходниках delphi?

 

никаких изменений в исходниках

смотрите сами

 

https://www.youtube.com/watch?v=SurYKJn9-dA

Ссылка на комментарий
  • 0

никаких изменений в исходниках

смотрите сами

 

https://www.youtube.com/watch?v=SurYKJn9-dA

 

Спасибо Вам за видео.

Я еще протестировал код без фикса на различных устройствах. На некоторых проблем не наблюдалось (samsung c android 4.3; desktop c windows 8 и 10), на некоторых был маленький "шум" (android 4.4.2), на некоторых было что-то типа такого https://youtu.be/EfFNAIfSRTg (nexus 7 c android 5.1.1; iOS simulator 7.1 и 9.1; desktop с windows 7).

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...