Перейти к содержанию
  • 0
ENERGY

Сетка в TimageList - артефакты на картинках. Проголосуйте!

Вопросы

Upd:

Пожалуйста проголосуйте. Думаю это всех касается, т.к. проблема связана и с TImageList и с TImage. 

https://quality.embarcadero.com/browse/RSP-18210

 

 

Сейчас столкнулся с большой проблемой перед самым релизом для заказчика..

17 картинок, разного размера. Сейчас в TImageList  сетка рисуется постоянно при обновлении Source каждой картинки. C каждым разом становится сетка четче.  Если раньше я просто обновлял на новые картинки, и таким образом решал проблему, то сейчас после обновления source картинок сетка остается на многих картинках, причем я даже не закрываю TImageList . Только начинаю замещать одни картинки, на других появляется сетка..

И вот что теперь делать незнаю..

 

Да кстати картинки портятся и в TImage со временем в Design Time.

Сетка означает что картинку много раз масштабируют. Но почему не сохраняют оригинал, это мне не понятно..

Что тут можно придумать?

 

Delphi Berlin Update 2

Отредактировал ENERGY

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


Ссылка на сообщение

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

  • 0

какая сетка в TImageList? как там вообще что рисуется? 

это же просто набор битмапов, из которых по запросу копируются более мелкие битмапы

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


Ссылка на сообщение
  • 0
5 часов назад, krapotkin сказал:

какая сетка в TImageList? как там вообще что рисуется? 

это же просто набор битмапов, из которых по запросу копируются более мелкие битмапы

Вот я сам не знаю. Этот  баг меня преследует давно. У меня кстати dpi 150% в системе (в Design time) может с этим связано? А у вас есть такой баг?

Delphi Berlin Update 2, все картинки png 24 bit

Вот скрин, и точно такая же фигня на релизе.

Вот здесь на скрине я только только обновил все картинки на новые, и линии рисуются сразу после добавления картинки на всех других. Чем больше добавляешь (обновляешь Source), тем четче становятся.

 

imagelist.png

 

@RoschinSpb Выручайте пожалуйста, что посоветуете?

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0

Вот сейчас кинул новый чистый список, решил добавить иконки только размером 48x48. Начал добавлять, и уже на 3 иконке начала появляться сетка на уже добавленных иконках. Я даже дизайнер ImageList не закрывал.

 

Я приаттачил зип файл с иконками 48x48, возможно кто-то может проверить у себя, возможно этот баг только у меня? Спасибо.

new.zip

 

Решение проблемы пока такое:

Добавляем картинки в ресурсы, и при старте в OnCreate DataModule загружаем их из ресурсов в ImageList.

 

 

unit DataModule;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, System.ImageList, FMX.ImgList,
  FMX.Graphics, System.Types, FMX.MultiResBitmap, System.UITypes;

type
  TImageListHelper = class helper for TImageList
    function Add(aBitmap: TBitmap): integer;
  end;

  TDataMod = class(TDataModule)
    StyleBook: TStyleBook;
    ImageList: TImageList;
    procedure DataModuleCreate(Sender: TObject);
  private
    procedure LoadImagesToImageList;
  public
    { Public declarations }
  end;

var
  gDataMod: TDataMod;

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}

procedure TDataMod.DataModuleCreate(Sender: TObject);
begin
  LoadImagesToImageList;
end;


// from resource
procedure TDataMod.LoadImagesToImageList;
var
  vBmp: TBitmap;
  i: Integer;

  procedure AddResourceToImageList(const aName: string);
  var
    vRes: TResourceStream;
  begin
    vRes := TResourceStream.Create(hInstance, aName, RT_RCDATA);
    try
      vBmp.LoadFromStream(vRes);
      ImageList.Add(vBmp);
    finally
      vRes.Free;
    end;
  end;

begin
  vBmp := TBitmap.Create;
  ImageList.BeginUpdate;
  try
    for i := 0 to 16 do
    begin
      AddResourceToImageList('i' + i.ToString);
    end;
  finally
    vBmp.Free;
    ImageList.EndUpdate;
  end;
end;

function TImageListHelper.Add(aBitmap: TBitmap): integer;
const
  SCALE = 1;
var
  vSource: TCustomSourceItem;
  vBitmapItem: TCustomBitmapItem;
  vDest: TCustomDestinationItem;
  vLayer: TLayer;
begin
  Result := -1;
  if (aBitmap.Width = 0) or (aBitmap.Height = 0) then exit;

  // add source bitmap
  vSource := Source.Add;
  vSource.MultiResBitmap.TransparentColor := TColorRec.Fuchsia;
  vSource.MultiResBitmap.SizeKind := TSizeKind.Source;
  vSource.MultiResBitmap.Width := Round(aBitmap.Width / SCALE);
  vSource.MultiResBitmap.Height := Round(aBitmap.Height / SCALE);
  vBitmapItem := vSource.MultiResBitmap.ItemByScale(SCALE, True, True);
  if vBitmapItem = nil then
  begin
    vBitmapItem := vSource.MultiResBitmap.Add;
    vBitmapItem.Scale := Scale;
  end;
  vBitmapItem.Bitmap.Assign(aBitmap);

  vDest := Destination.Add;
  vLayer := vDest.Layers.Add;
  vLayer.SourceRect.Rect := TRectF.Create(TPoint.Zero, vSource.MultiResBitmap.Width,
      vSource.MultiResBitmap.Height);
  vLayer.Name := vSource.Name;
  Result := vDest.Index;
end;

end.

 

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0

Если нажать Export, то в полученном файле тоже сетка будет?

Если сделать двойной клик по Selected Image, появится Multires Bitmap Editor, на нем тоже будет видна сетка?

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


Ссылка на сообщение
  • 0

А, вот!
all5.png.18d3886095d690c41fc2fb1b79edae26.png
На сиэтле.
Да, странная картина, еще более странно, что ни кто не замечал такого поведения.

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


Ссылка на сообщение
  • 0

@RoschinSpb

Может запостить баг? Или он уже есть?

 

Цитата

Да, странная картина, еще более странно, что ни кто не замечал такого поведения.

Я кстати думал что про него уже все давно знают.. Просто нет времени.. :)

Между прочим картинка  в Timage тоже портится со временем в Design Time.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
4 часа назад, ENERGY сказал:

@RoschinSpb

Может запостить баг? 

Не может, а точно. :)

А баг не заметили потому, что проявляется далеко не на всех картинках. Как я понял только на одном, или нескольких оттенках серого (Ц).
Это на сколько я понял из-за того, что при записи TBitmap в поток и последующем восстановлении данные получаются не совсем идентичными.

Вот например если эту процедуру запускать несколько раз, то картинка становится клетчатой

procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      Bitmap.SaveToStream(Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

Вот, что у меня получилось. Вторая картинка (для сравнения) преобразуется точно также, но как видно не портится.

Demo.png.e1c4aa44aeb05dafd530dc559aef2a4c.png

Так что проблема не в TImageList и не в TImage, а где-то на более глубоком уровне. Добавляю также небольшой демо проектик. Проверял на Windows 10. Интересно что будет на других платформах.

Proj.zip

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


Ссылка на сообщение
  • 0

@RoschinSpb

Сетка появляется на всех картинках, без исключения, посмотрите выше, там была оранжевая картинка. Просто на цветных картинках она не сразу "проявляется", а постепенно.

Может вы запостите баг? Просто, вы лучше объясните вероятную причину этого явления, т.к. знаете этот компонент и внутренности FMX гораздо лучше меня, а мы поддержим голосами. Да и к вам будет больше доверия, т.к. вы FireMonkey разработчик, возможно баг сразу запуститься в обработку.

Картинки портятся только при работе в Design Time - так что это в любом случае касается всех платформ. В уже скомпилированной программе они вроде не портятся, если конечно не были до этого испорчены в design time, но не проверял.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0

косяк в том что fmx сохраняет в stream в формате png, то есть все время идет перекодировка картинки. и винда видно что то косячит с альфаканалом. если сделать так 

procedure BitmapSaveToStream(bmp:TBitmap; var Stream: TMemoryStream);
var
  Surf: TBitmapSurface;
begin
  Surf := TBitmapSurface.Create;
  try
    Surf.Assign(bmp);
    TBitmapCodecManager.SaveToStream(Stream, Surf, '.wmp');
  finally
    Surf.Free;
  end;
end;


procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      BitmapSaveToStream(bitmap, Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

то все красиво. 

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


Ссылка на сообщение
  • 0

ну вот и ответ почему никто не сталкивался )))

сейчас все в PNG изначально картинки юзают 

 

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


Ссылка на сообщение
  • 0
9 часов назад, ENERGY сказал:

@RoschinSpb

Сетка появляется на всех картинках, без исключения, посмотрите выше, там была оранжевая картинка. Просто на цветных картинках она не сразу "проявляется", а постепенно.

Не, посмотрите на картинку ниже, 120 циклов и она выглядит как живая.
На баги лучше реагируют на те, которые от официальных юзеров. На баги от работников, тем более бывших реагируют плохо.

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


Ссылка на сообщение
  • 0
4 часа назад, krapotkin сказал:

ну вот и ответ почему никто не сталкивался )))

сейчас все в PNG изначально картинки юзают 

Я использую только PNG и эта проблема связана именно с png картинками (с jpeg такой проблемы нет, я проверил только что).

1 час назад, RoschinSpb сказал:

На баги лучше реагируют на те, которые от официальных юзеров. На баги от работников, тем более бывших реагируют плохо.

У меня пиратка, но если вы не сможете запостить, тогда я сам отправлю.

Мне просто показалось что вы смогли бы технически лучше меня объяснить причину.

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
1 час назад, ENERGY сказал:

У меня пиратка

Про свою, я вообще молчу. :unsure:
Да технически всё понятно, при записи в поток и обратно получаются не идентичные результаты. Проявляется это в редакторе имажелиста потому, что там это происходит чаще чем везде. Там постоянно устанавливается свойство Dormant.

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


Ссылка на сообщение
  • 0

Пожалуйста проголосуйте. Думаю это всех касается, т.к. проблема связана и с TImageList и с TImage. 

https://quality.embarcadero.com/browse/RSP-18210

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


Ссылка на сообщение
  • 0

Проголосовал, это просто эпик!

---

Сильно подозреваю что баг не на всех компах воспроизводиться.

У меня на виртуалке воспроизводится, надеюсь и у аутсорсеров тоже воспроизведется.

Отредактировал Error

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


Ссылка на сообщение
  • 0

на андроиде не воспроизводится. было бы еще хорошо на маке проверить. мое мнение - виноват встроенный кодировщик винды который каждый раз по разному пережимает файл. 

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


Ссылка на сообщение
  • 0
14 часа назад, haword сказал:

на андроиде не воспроизводится. было бы еще хорошо на маке проверить. мое мнение - виноват встроенный кодировщик винды который каждый раз по разному пережимает файл. 

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

 

 

 

Отредактировал ENERGY

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


Ссылка на сообщение
  • 0
В 02.06.2017 в 22:58, ENERGY сказал:

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

 

 

 

Зря только начал с упоминания TImageList. Подозреваю, что начнут его чинить и в результате испортят.

 

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


Ссылка на сообщение
  • 0
В 02.06.2017 в 22:58, ENERGY сказал:

А смысл в таких проверках. Если перебрасывать со стрима в стрим - то может и не воспроизводится.

Проблема то возникает только если что-то делать в Design Time. Среда работает только в Windows, поэтому такие иконки будут на всех платформах при конечной сборке. 

потому то и вылезает проблема в дизайнтайме потому что там гоняется через стрим скорее всего картинка. если починят прогон через стрим то и дизантайме все думаю наладится. 

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


Ссылка на сообщение
  • 0

Да, проблема в стрим. И скорее всех на уровне ОС Windows. Сама Fire Monkey не занимается кодированием-декодированием png-файлов.

procedure TForm2.UpdateBitmap(var Bitmap: TBitmap);
var
  Stream: TMemoryStream;
begin
  if Bitmap <> nil then
  begin
    Stream := TMemoryStream.Create;
    try
      Bitmap.SaveToStream(Stream);
      FreeAndNil(Bitmap);
      Stream.Position := 0;
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromStream(Stream);
    finally
      FreeAndNil(Stream);
    end;
  end;
end;

При однократном перекодировании артефакты практически не заметны так что на других платформах это не столь критично.

Заметно становится только при многократном перекодировании, что и происходит в IDE. Есть кто с честной версией? Может продублируете багрепорт со ссылкой на https://quality.embarcadero.com/browse/RSP-18210.

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


Ссылка на сообщение
  • 0

Если я правильно понял, то таких багов уже зарепортена толпа. Начиная от того, что каждое сохранение формы со StyleManager (даже если на форме вообще ничего не трогали) приводит к практически полному изменению картинок в стиле. В любой системе контроля версий это видно великолепно. Задалбывает каждый раз выборочно ревертить изменения.

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


Ссылка на сообщение
  • 0
15 часов назад, kami сказал:

Если я правильно понял, то таких багов уже зарепортена толпа. Начиная от того, что каждое сохранение формы со StyleManager (даже если на форме вообще ничего не трогали) приводит к практически полному изменению картинок в стиле. В любой системе контроля версий это видно великолепно. Задалбывает каждый раз выборочно ревертить изменения.

Картинки меняются даже в Delphi 6 (не XE6), но вот заметных артефактов не наблюдается.

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


Ссылка на сообщение
  • 0

Не знаю... ни в D7, ни в D2010 не  сталкивался с изменением dfm-ок в плане картинок. В том числе - в ImageList.

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


Ссылка на сообщение
  • 0
2 минуты назад, kami сказал:

Не знаю... ни в D7, ни в D2010 не  сталкивался с изменением dfm-ок в плане картинок. В том числе - в ImageList.

потому что там картинки хранятся так как есть, то есть в каком формате закинули на форму, и если timage понимает его, то в таком формате оно и будет лежать. в fmx я так понимаю, все преобразовывается в png при перемещении через стрим. то есть не помещается то что было в стрим а с начало преобразовывается в png, потом заливается в стрим, потом читается от туда и располагается на форме. я подозреваю сделали это для того что бы сохранять прозрачность изображений. идея то в принципе верная НО кто же знал что винда косячит. 

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


Ссылка на сообщение

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

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

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

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

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

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

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

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


  • Похожий контент

    • От x11
      Не могу понять, что случилось в проекте с TDataModule.
      Проект мультиплатформенный. В прошлый раз сохранил, закрыл, ничего необычного. Сегодня открываю, а мне ошибку Delphi Berlin показывает.
       
      И действительно, у TImageList отсутствует свойство source. Открываю, а он выглядит по-другому, как будто из VCL.
      Закрываю проект, создаю мультиплатформенную форму, кладу TImageList на форму и о чудо - совершенно другой TImageList и свойство Source есть.
      Что случилось с моим TDataModule? Как среде дать понять, что это мультиплатформенный проект?

    • От x11
      Не знаю, куда правильно задать вопрос. Решил здесь.
      Обычная стандартная связка TImageList + TActionList+TSpeedButton.
      в TImageList загрузил картинку 32*32.
      Всё связал и она появилась у кнопки на панели.
      Обратил внимание, что картинка 32*32 маловата и я решил загрузить картинку 48*48.
      Удалил из TImageList картинку и загрузил новую. Но размер картинки на кнопке остался 32*32.
      А потом ещё и исчезла картинка из TActionList.
       
      В TImageList только одна картинка.
      Delphi Berlin.


    • От DrMzi
      Доброго времени суток!
      Собираю тестовый проект под Win, иконки вижу.
      C:\Users\Public\Documents\Embarcadero\Studio\19.0\Samples\Object Pascal\Multi-Device Samples\User Interface\ListView\ListViewImageIndex
      Собираю тестовый проект под Android, иконок нет.
      Что я делаю не так ?

      Поправка. Такое поведение у apk на xiaomi mi5, запустил на Philips Xenium - иконки есть. 
       
    • От ENERGY
      Меня это проблема преследует со времен VCL...
      Подскажите как же ее решить...
      FMX TListView - ItemAppearanceName = ImageListItem.   Лежит fmx TimageList, в настройках указано 16x16 и прорачный цвет clNone, добавил одну иконку 16x16 с прозрачностью. Если запустить под Windows 10  все ок. Если запустить под Android то при выделении (selected) вместо прозрачности белый цвет. В результате иконка некрасиво обрамлена в белом квадрате.. Иконку делал в Axiallis IconWorkShop, сохранил как ico,  Пробовал заливать белым вместо прозрачного, и затем ставить в TimageList белый как прозрачный - тоже самое...
      Что же делать...
    • От RoschinSpb
      Статья: http://community.embarcadero.com/blogs/entry/timagelist101ru-1 Автор: Сергей Рощин Обзор новых возможностей, которые появились в компоненте и редакторе TImageList для Delphi R101 (2016 год, Version 24)
    • От FAN
      Очень нравится timagelist, большое спасибо!
      Но хотелось бы иметь возможность выбрать несколько destination images и отредактировать их свойства
      Также хотелось бы добавлять destination images не по одиночке а группами с заданными свойствами
       
       
       
    • От AndroidHalfNoob
      Что то не могу догнать: загрузил в ImageList 2 картинки, а вот в ListView не получается их засунуть.
      var  LItem: TListViewItem;

      если прописываю прямой путь к файлу на компе, то все работает
       


    • От Vitaldj
      Коллеги, появился TImageList и это очень хорошо. Но не совсем понятно до конца как он работает? К простой кнопке я его прикрутил TButton, и он картиночка отобразилась влева. Но мне совсем не нравиться вид ее! Она какая то маленькая и отступ слава маловат. Вот для примера посмотрите, наверху кнопка с иконок сделана по старому, положил TImage, а внизу по новому, через TImageList.
      Как менять параметры отображения у TButton?

      А, еще прикол! В маке она вообще не отображается!!! ))


    • От ovk
      Прошу помощи,как вывести иконки в ListView которые хранятся в StyleBook ?
      у меня есть база,в ней хранятся ID иконок, которые нужно выводить,в StyleBook лежат иконки, может у кого есть подобный опыт?!
    • От 7profy
      Имеем: FireMonkey приложение (в XE5).
      Создаем TStyleBook в котором существуют несколько TImage (по типу TImageList). Бросаем на форму кнопочку TSpeedButton. Вопросы:
      Возможно ли на этапе Design-time прикрутить изображение из StyleBook на эту кнопочку? Аналогично "прикрутить" изображение к TAction?
  • Последние посетители   0 пользователей онлайн

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

×
×
  • Создать...