Ho un modulo con una TImmagine grande su di esso come sfondo. Il problema è che questo è memorizzato direttamente nel DFM come bitmap, che occupa circa 3 MB. Il file PNG originale è ~ 250K. Mi piacerebbe provare a ridurre il bloat incorporando il PNG in una risorsa e quindi caricandolo nel modulo durante OnCreate. Posso farlo ora che Delphi 2009 include il supporto PNG, tranne che non so come creare un file di risorse con un PNG. Qualcuno sa come è fatto?Come si crea una risorsa PNG?
risposta
Esempio file di testo (denominato myres.rc):
MYPNG RCDATA mypng.png
Aggiunto al progetto:
{$R 'myres.res' 'myres.rc'}
esempio di caricamento in fase di esecuzione:
uses
PngImage;
var
Png: TPngImage;
begin
Png := TPngImage.Create;
try
Png.LoadFromResourceName(HInstance, 'MYPNG');
Image1.Picture.Graphic := Png; // Image1: TImage on the form
finally
Png.Free;
end;
end;
Se stai usando Delphi 2009, TImage dovrebbe memorizzare il file PNG come PNG nel file DFM. Il DFM sarà più grande perché il contenuto binario della proprietà Picture.Data dell'oggetto TImage è codificato nel DFM come testo esadecimale. Ma quando il DFM è compilato nel tuo EXE, viene compilato in una risorsa binaria. L'immagine dovrebbe quindi occupare lo stesso spazio all'interno della risorsa RCDATA del modulo poiché la memorizzazione del PNG nella propria risorsa RCDATA.
Ho appena provato questo aprendo uno dei miei file DFM Delphi 2009 che hanno un componente TImage con un'immagine PNG caricata in fase di progettazione in un editor di testo, copiando il contenuto della proprietà Picture.Data e incollandoli in un editor esadecimale. L'editor esadecimale mi mostra che la proprietà Picture.Data memorizza un file PNG effettivo con prefisso di 10 byte. Il primo byte è $ 09 e il successivo 9 incantesimo TPngImage. Se cancello quei 10 byte e salvo il file nell'editor esadecimale, ottengo un file PNG corretto.
Quindi, se si utilizza Delphi 2009, è sufficiente caricare l'immagine PNG in un componente TImage in fase di progettazione.
Interessante, ma per quanto riguarda il caso in cui un'immagine viene riutilizzato su più moduli? Delphi è abbastanza intelligente da memorizzare solo una copia o memorizza l'immagine n volte, dove n è il numero di componenti di TImage con quell'immagine caricata? :) – Drarok
Ogni componente di TImage memorizza la propria immagine indipendentemente da altre istanze di TImage.Quindi, se si carica la stessa immagine in n istanze di TImage, la stessa immagine viene memorizzata n volte. Un modo per risolvere questo è usare l'ereditarietà della forma. Crea un modulo base con TImage e carica l'immagine in esso. Quindi derivare tutte le forme che devono avere la stessa immagine tImage da quella forma. Qualsiasi proprietà che non viene modificata nei moduli discendenti viene memorizzata solo nel DFM del modulo antenato. Ciò include i dati dell'immagine di una TImage. –
abbastanza simile al mio esempio: http://www.ciuly.com/index.php/delphi/article/delphi/7-multimedia/10-pngfromresource.html
Per chi usa C++ Builder questo codice funziona per me:
Nel ResourceTest.rc il file
IMG_BMP BITMAP "Ressources\\myimage.bmp";
IMG_PNG RCDATA "Ressources\\myimage.png";
Nel file ResourceTest.rh
#ifndef ResourceTestRH
#define ResourceTestRH
#define IMG_BMP "IMG_BMP"
#define IMG_PNG "IMG_PNG"
#endif
Nel file ResourceTest.cpp
#include "pngimage.hpp"
// Loading bmp image from resource
Graphics::TBitmap *bmpImage = new Graphics::TBitmap();
bmpImage->LoadFromResourceName((int)HInstance, IMG_BMP);
// Loading png image from resource
TPngImage *pngImage = new TPngImage();
pngImage->LoadFromResourceName((int)HInstance, IMG_PNG);
'RCDATA' è davvero il tipo di risorsa più specifico disponibile per quel tipo di grafico? Non c'è 'RT_PNG', per esempio? –
Buona domanda, Rob. Il mio Platform SDK attualmente installato è per Windows Server 2003 R2 e non sono riuscito a trovare una costante specifica per PNG in WinUser.h. Non sono sicuro, però. Potrebbe essere dichiarato altrove, forse in una versione successiva di Platform SDK. –
LoadFromResourceName cerca specificamente una risorsa di tipo RCDATA. –