Autor Téma: Firemonkey "kazí" obrázky nahrané v TImage  (Přečteno 4963 krát)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Firemonkey "kazí" obrázky nahrané v TImage
« kdy: 02-03-2022, 11:25:13 »
Vážená skupino,

nevíte, kde se v Delphi (verze 10.4 / 11) nastavuje, aby se "nekazily" obrázky uložené v komponentě TImage?

Příklad: nahraji obrázek do TImage komponenty a vypadá dobře. Jenže patrně kopírováním té komponenty, popřípadě zavíráním / otevíráním Delphi si všímám pixelových chyb, které vznikají nejčastěji u částečně průhledných pixelů nahraného PNG obrázku. Obrázek nenačítám při spuštění aplikace, komponenta TImage si ji nese s sebou.

Přiložil jsem obrázek, kde jsou viditelné kazy. Delphi patrně vlivem načítání / ukládání / kopírování této komponenty poškodí strukturu obrázku. Nebo se jedná o nějakou kompresi?

Děkuji.
 

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #1 kdy: 03-03-2022, 14:53:22 »
Přikládám porovnání dvou .fmx souborů (něco jako dfm u VCL). Je vidět, že dva stejné obrázky se značně liší. Co to způsobí nevím.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #2 kdy: 03-03-2022, 19:56:29 »
Dokážete je uložit do samostatných PNG souborů?
(k porovnání třeba dle https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header)

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #3 kdy: 04-03-2022, 06:59:41 »
Zkoušel jsem vymyzat prázdné znaky a nechat jen HEXa popis PNG souboru, ale obrázek se nezobrazí. Asi budu muset napsat na oficiální Delphi podporu, že mají chybu v TImage komponentě.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #4 kdy: 04-03-2022, 08:47:28 »
kopírováním té komponenty,
Tim mas na mysli, ze ji prozenes pres clipboard?
Citace
zavíráním / otevíráním
Jedna se o otevirani/zavirani stale na stejnem pocitaci nebo to .fmx "proleze" nekolik pocitacu napr. s ruznym grafickym rozlisenim?

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #5 kdy: 04-03-2022, 09:09:06 »
Kopírováním mám na mysli, že vyberu komponentu a dám CTRL+C / CTRL+V

Vždy se jedná o otevírání a zavírání projektu jen na jednom počítači.


Zkoušel jsem problém nasimulovat na novém FMX projektu, ale nepodařilo se mi to zduplikovat. Jediné co mám je pracovní projekt s velkým množstvím komponent, kde se to stává. Prakticky většina TImage komponent které jsem vytvářel dříve trpí touto chybou. Když vytvořím novou komponentu TImage a obrázek do ní "nově" vložím, pak se nějaký čas u této komponenty PNG obrázek objevuje správně. Je ale otázka času, než se opět "pokazí".
Je velmi pravděpodobné, že tato chyba je něčím způsobena - nějakou činností v Delphi. Nepodařilo se mi zjistit jakou. Vždy ale dělám jen standardní činnost, Delphi mi prakticky nepadá...
« Poslední změna: 04-03-2022, 09:16:08 od age.new »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #6 kdy: 04-03-2022, 10:22:37 »
Zkoušel jsem problém nasimulovat na novém FMX projektu, ale nepodařilo se mi to zduplikovat. Jediné co mám je pracovní projekt s velkým množstvím komponent, kde se to stává. Prakticky většina TImage komponent které jsem vytvářel dříve trpí touto chybou. Když vytvořím novou komponentu TImage a obrázek do ní "nově" vložím, pak se nějaký čas u této komponenty PNG obrázek objevuje správně. Je ale otázka času, než se opět "pokazí".
No to vypada na bug v Delphi -> nejake prepisovani pameti. Pokud se to vyskytuje jen v design-time, tak bych na to napsal ticket, i kdyz tam nejaky Vojta bude nejspis tupe vyzadovat SSCCE
« Poslední změna: 04-03-2022, 10:24:22 od pf1957 »

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #7 kdy: 04-03-2022, 11:10:22 »
Ano. Bude to nějaká hloupost. Již jsem vytvořil tiket na "quality" portálu Embarcadero. Ale nedomnívám se, že s tím někdo něco udělá a bude to "cannot be reproduced".

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #8 kdy: 21-06-2022, 07:00:19 »
Jelikož ze strany Embarcadero něpřišla žádná odpověď, vytvořil jsem postup, který by měl reproduktovat problém s TImage. Mimochodem, děje se to i v nejnovější Delphi verze 11.1. Zajímal by mě Váš názor.

Postup:
1) spustíme Delphi
1) vytvoříme prázdný FMX projekt
2) na formulář vložíme TImage komponentu a nahrajeme do ní libovolný PNG obrázek
3) uložíme a dáme build
4) vykopírujeme si fmx soubor (Firemonkey form) někam stranou
5) ukončíme Delphi
6) spustíme Delphi a otevřeme uložený projekt 
7) provedem copy&paste TImage komponenty na formuláři
8) uložíme a dáme build
9) vymažeme nově zkopírovaný TImage (takže se jakoby nic nezměnilo)
10) uložíme a dáme build
11) porovnáme nový fmx s původním vykopírovaným (např. v TotalCommanderu) a mělo by být vidět, že se změnila uložená datová struktura PNG obrázku

... když se toto staně několikrát, začne se měnit i samotný obrázek - nejlépe je to vidět na poloprůhledných pixelech. Ten copy&paste krok není úplně nutný - je to jen postup, jak docílit nějaké změny aby se nově uložil fmx soubor do projektové složky.
« Poslední změna: 21-06-2022, 07:01:52 od age.new »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7427
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #9 kdy: 21-06-2022, 08:41:55 »
Nie je lepšie použiť TVirtualImageList? Tam k niečomu takému nemôže dôjsť, nakoľko zdroj obrázkov je len jediný. Zvyčajne na DataModul.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #10 kdy: 21-06-2022, 08:47:26 »
Nie je lepšie použiť TVirtualImageList? Tam k niečomu takému nemôže dôjsť, nakoľko zdroj obrázkov je len jediný. Zvyčajne na DataModul.

To mi není jasné. V čem je to jiné?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7427
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #11 kdy: 21-06-2022, 09:47:11 »

Komponent TVirtualImageList pridá do dfm iba textové odkazy na obrázky. Netuším ako to je pre FireMonkey. Nerobím s tým. Nezanedbateľná je aj skutočnosť vylepšeného vykresľovania. Je to viditeľný rozdiel.Tu je niečo z návodu:
Komponent TImageCollection ukladá, mení mierku a kreslí obrázky. Komponent vám umožňuje používať obrázky s natívnymi formátmi pomocou triedy TWICImage.
Ako zdroj obrázkov použite TImageCollection v kombinácii s komponentom TVirtualImageList. Pokyny na používanie týchto dvoch komponentov nájdete v časti Podpora obrázkov s vysokým rozlíšením DPI pomocou komponentov Image Collection a Virtual ImageList.
TImageCollection je zdedený z triedy TCustomImageCollection, ktorá definuje základné metódy pre kolekciu.
 Komponent TVirtualImageList vytvára dynamický zoznam interných obrázkov. TVirtualImageList, zdedený z TCustomImageList, používa TCustomImageCollection na dynamické vytváranie zoznamu interných obrázkov. Obsahuje kolekciu položiek prepojených indexom a názvom s TImageCollection.
RAD Studio vám umožňuje zahrnúť škálovanie, obrázky s vysokým DPI a viacerými rozlíšením do vašich Windows VCL aplikácií pomocou komponentu TImageCollection v kombinácii s komponentom TVirtualImageList.
Upozornenie: Ak používate FireMonkey pre multiplatformové aplikácie, pozrite si komponent TImageList a príručku FireMonkey na používanie TImageLists ako centrálneho úložiska obrázkov.
Tieto spárované komponenty oddeľujú koncept kolekcie obrázkov (kde každý logický obrázok môže mať viacero rozlíšení) od zoznamu obrázkov v jedinej špecifickej veľkosti použitej pre ovládací prvok. Stručne povedané, načítajte do zbierky obrázkov obrázky vo viacerých rozlíšeniach. Zoznam obrázkov obsahuje sadu obrázkov pochádzajúcich z kolekcie obrázkov a prezentuje ich v určitej veľkosti (povedzme 16x16). Veľkosť obrázkov a ich mierka sa plynule mení a skutočné rozlíšenie prezentácie zoznamu obrázkov sa môže meniť na základe DPI. Je plne kompatibilný s tradičnými zoznamami obrázkov a je náhradou za tradičné zoznamy obrázkov, vrátane poskytnutia rukoväte HIMAGELIST, a môžu ho používať ovládacie prvky VCL a akýkoľvek kód používajúci volania zoznamu obrázkov rozhrania Windows API.
 Obrázky podporujú alfa kanály a do zbierky obrázkov môžete načítať súbory PNG, jpeg, jpg, gif a tiff. Môžete tiež načítať staré bitové mapy priehľadnosti s farebným kľúčom.
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #12 kdy: 21-06-2022, 10:44:44 »
Ať už TImage nebo TImageList (a předpokládám i jiné pro VCL) ukládají vložené obrázky do fmx (dfm) souboru. A pokud Delphi má chybu v opakovaném načítání a ukládání dat obrázku, tak je úplně jedno jaká komponenta to je. Jinak jestli se nepletu, tak TImageList vychází z TImage komponent a chyba se změnou struktury obrázků se mi projevila i zde.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7427
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #13 kdy: 21-06-2022, 12:58:10 »

Nie som odborník, a pri mojich vedomostiach súhlasím so všetkým čo si tu napísal.
Ale...
Objasním situáciu. Asi Ti chýbajú vedomosti.
.
Jediný držiteľ obrázkov je TImageCollection. Ten existuje "jediný" pre danú situáciu. Na každý formulár sa vkladá TVirtualImageList. Ten do dfm súboru uloží len textový odkaz na v ňom použité obrázky. Nič viac. Jeho kopíravaním nemôže dôjsť k zmene obrázkov - lebo žiadne neobsahuje. To je základný a obrovský rozdiel medzi TImageList a TVirtualImageList.
.
Do prílohy som dal úplný preklad všetkého k týmto komponentom. Nie je toho veľa. Prečítaj si to. Pochopíš o čom tu točím :)
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7427
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #14 kdy: 21-06-2022, 13:04:42 »
Ešte prikladám čo je v dfm
Kód: Delphi [Vybrat]
  1.   object vilBtnN: TVirtualImageList
  2.     Images = <
  3.       item
  4.         CollectionIndex = 237
  5.         CollectionName = 'print'
  6.         Name = 'print'
  7.       end>
  8.     ImageCollection = dtmdBasic.icMainN
  9.     Width = 32
  10.     Height = 32
  11.     Left = 100
  12.   end
  13.   object vilBtnD: TVirtualImageList
  14.     Images = <
  15.       item
  16.         CollectionIndex = 237
  17.         CollectionName = 'print'
  18.         Name = 'print'
  19.       end>
  20.     ImageCollection = dtmdBasic.icMainD
  21.     Width = 32
  22.     Height = 32
  23.     Left = 150
  24.   end
  25.   object vilBtnH: TVirtualImageList
  26.     Images = <
  27.       item
  28.         CollectionIndex = 237
  29.         CollectionName = 'print'
  30.         Name = 'print'
  31.       end>
  32.     ImageCollection = dtmdBasic.icMainH
  33.     Width = 36
  34.     Height = 36
  35.     Left = 200
  36.   end
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #15 kdy: 21-06-2022, 14:11:03 »
Kdybych to věděl, tak bych se neptal. Jen mi ještě nedochází kam se ten obrázek ukládá, když ne do dfm / fmx souboru?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7427
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #16 kdy: 21-06-2022, 16:28:34 »
Samozrejme, že sa ukladá do dfm/fmx. Ja sa v tom vôbec nevyznám. Prikladám ukážku uloženia jedného obrázka (DataModul). Ja akosi nevidím dôvod na také čachre-machre ako si tu popísal. To nič nemení na tom, že to nesmie mať vplyv na už uložené údaje.
Kód: Delphi [Vybrat]
  1.   object icDBNavN: TImageCollection
  2.     Images = <
  3.       item
  4.         Name = 'button_rounded_blue_first'
  5.         SourceImages = <
  6.           item
  7.             Image.Data = {
  8.               89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
  9.               61000000097048597300000EC400000EC401952B0E1B0000010349444154388D
  10.               63B4ABD81CC7C0C03085818181978134F09181812183858181611A0303033789
  11.               9A19181818F819181866B290A91906F85828D0CCC0C0C0C08061C0963A770606
  12.               0606069FA69D28E2AA527C0CFD299618E21806F072B2A2F0A584B818925DD519
  13.               9CF4A51898181909BB000604B8D918E29C5419FCCCE41958599888F7020C2C2F
  14.               7562E062271C443855FCFCFD973203A27AF63344D8293184D9283170B2E13608
  15.               A7CCB79F7F18E6EDBEC5B0E1C44386446735062F1359061666CCB0C030E0E3B7
  16.               5F28FC779F7F32F46EB8CCB0EAC83D86A999D6180630DA556CFE8FD37D4400AA
  17.               A4C4EF0C0C0C9C64EAFFCCC2C0C050C0C0C030810C43BE323030E402002AA331
  18.               398595F1EF0000000049454E44AE426082}
  19.           end
  20.           item
  21.             Image.Data = {
  22.               89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
  23.               F8000000097048597300000EC400000EC401952B0E1B00000201494441544889
  24.               BD95314C136114C77FEF7AE56893DA5661C1868190D468A4C4BDC69030906010
  25.               D4A00E0D717271305189713630EAE2647464C090C0C28830B9484888830B8321
  26.               612046890B9AD8E7C0DDF1DDD76B0F6AE37F79FFF7BEBB77EFFFCF77DF27D5D9
  27.               9522F05A446EAAAA0B2022A2AA6A7333B7A3B1F61B58109187EB73E33F5DE00D
  28.               3009081036FA07A4811AE0003557446EF8CD111131278DE3666E478BDF016AAE
  29.               AA0A1027B55D8B029E0670EDC95415558DE54024B7A331470837467E2237733B
  30.               E2DB1D7EC094171455958DF9EB00CCBFDF62F5D36E643A114155B9776D90D1E1
  31.               F3DC7FB561AE47FA452C8A436FBEBBA13632D4C7A389CBA41C21D3956AF97E83
  32.               45C1844616D62EF6177976ABC2B99C47D6739B5978328B8EA1F4E6BB797E7B98
  33.               72A940A62B155A0450AFABFDCEE92CBA32D0C3DDAB8389563443A245E55281AC
  34.               D73847F08CE3B4B98B027CD9FD41B954C0735338CE71737FFF275B94A46073E7
  35.               1B2F16B7783A55E142294F2E93EEAC0250F60F0E79FCF62397FA8B3C99AA7036
  36.               E791CFA64FA6C09EBE153E7FFDCECCCB0FE17FA0C0195F5133245AB47FF0ABA1
  37.               B6B6BDC7DAF61ED3D5014686FAECF5E8D1539D5DA99B9202A9E65E37B999DBD1
  38.               4768D1FADCB89CCAA276F07F4FD30E5F387FE06817AD02636DE96F8D2538B268
  39.               0678078C8988634E1AC7CDBCC99D5C0796810700A231D75C27F117824915763A
  40.               B3E0CF0000000049454E44AE426082}
  41.           end>
  42.       end
  43.       item
  44.         Name = 'button_rounded_blue_previous'
Netuším, či aj pri klasickom TImageList je obrázok rozdelený na dve časti ako tu. Predpokladám, že áno. Jaj, ja tam mám 16x16 a 24x24 :) .
Nepoužívam FireMonkey, takže to nemôžem vyskúšať.
« Poslední změna: 21-06-2022, 16:30:44 od Stanislav Hruška »
Win11 64b, Delphi 12.2, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #17 kdy: 26-06-2022, 16:43:56 »
Jelikož ze strany Embarcadero něpřišla žádná odpověď, vytvořil jsem postup, který by měl reproduktovat problém s TImage. Mimochodem, děje se to i v nejnovější Delphi verze 11.1. Zajímal by mě Váš názor.

Znovu jsem se dival na ten puvodni hexa dump s rozdily, ale ten ti nic nerekne, protoze na zacatku PNG formatu jsou shodne chunky: iHDR, iRGB, gAMA a prvni iDAT, ktery obsahuje kompresovany stream dat, ktery se lisi.

Pokud bys do toho chtel sam nejak proniknout, tak abys zjistil, co se presne deje, tak bys zrejme musel napsat nebo si upravit nejaky existujici dekoder resp. porovnavaci tool, ktery by ten soubor dekodoval a zobrazoval rozdily az na vyssi urovni. Taky jsme to delavali treba 3-cestne, kdyz jsme v ramci zpetneho inzenyrstvi lustili nejake cizi proprietarni formaty.

Offline age.new

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #18 kdy: 27-06-2022, 09:35:26 »
Samo o sobě je podezřelé, že první uložení PNG obrázku má nějakou datovou strukturu a restart Delphi tuto strukturu změní i co se týče velikosti. Je to navíc jediný ukazatel na problém se změnou grafiky PNG souborů, který je vidět pouhým okem - hlavně u poloprůhledných pixelů.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #19 kdy: 28-06-2022, 07:25:11 »
Samo o sobě je podezřelé, že první uložení PNG obrázku má nějakou datovou strukturu a restart Delphi tuto strukturu změní i co se týče velikosti.
Podezrele... to by mohl byt ev. dusledek pouziti radkoveho filtru, ktery ma za ukol zlepsit kompresi viz treba https://www.root.cz/clanky/radkove-filtry-v-png/. Aby tomu tak nebylo, tak by se vzdy musela pouzivat filtrace None, coz nevim, jestli Delphi dela. Ale co se presne deje, k tomu bys potreboval dekodovat obsah puvodniho a deformovaneho obrazku, jak jsem ti psal.

Resenim na prasaka, kdy se nebude zjistovat presna pricina, je vyhnout se tomu, abys pri zmene formulare zapisoval take obrazek -> dat ho nekam do "ReadOnly" banky a odtamtud ho jen nacitat a renderovat, asi neco ve smyslu, co ti doporucoval Standa.
« Poslední změna: 28-06-2022, 07:29:03 od pf1957 »

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 1144
  • Karma: 29
    • Verze Delphi: XE8, Sydney
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #20 kdy: 28-06-2022, 08:10:14 »
No, na mě to dělá dojem, že ta bezztrátová komprese v PNG je trošičku ztrátová :)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3534
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Firemonkey "kazí" obrázky nahrané v TImage
« Odpověď #21 kdy: 29-06-2022, 08:03:47 »
No, na mě to dělá dojem, že ta bezztrátová komprese v PNG je trošičku ztrátová :)
Neznam detailne vnitrnosti formatu PNG, ale zda se, ze filtrace kvuli zlepseni komprimace muze pusobit ztratove, coz by samo o sobe nemuselo byt na zavadu: vytvorim obrazek, ulozim ho se ztratovou "kompresi" a prohlednu si vysledek, jestli jsem s nim spokojen.

Ovsem u Delphi je problem, ze on obrazky nevytvari, jen nacte existujici a pak si je nekde schovava => to by mel delat vyhradne bezeztratove tj. s filtraci None, aby original jen verne prekopiroval. A pokud to nedela (nevim), tak je to z principu spatne a EMB by to mel zmenit.