Autor Téma: Firemonkey "kazí" obrázky nahrané v TImage  (Přečteno 4939 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ů: 7426
  • 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ů: 7426
  • 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ů: 7426
  • 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ů: 7426
  • 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.