• 0
enatechno

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

Вопрос

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? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

9 ответов на этот вопрос

  • 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

ну вот все дело в очистке так и знал же :)

enatechno понравилось это

Поделиться сообщением


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

 

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

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

 

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

enatechno понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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).

Равиль Зарипов (ZuBy) понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

а что разве еще есть те кто не правит исходники и пользуется с глюками?:)

zairkz понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу