PNG w bibliotece DLL

0

Potrzebuję umieścić grafikę w bibliotece DLL, aby można wczytywać grafiki bezpośrednio z jednego pliku.

Ponieważ PNG obsługuje przeźroczystość, korzystam z TPngImage, który integruje się z TImage dodają obsługę formatu PNG.

Stworzyłem zasoby RcData, ale już na wstępie widać, że "uszkodzona" jest przeźroczystość. To pierwszy problem.

Drugi problem jest taki, że nie można wczytać grafiki PNG z zasobów w ten sposób:

Image1.Picture.LoadFromResourceName 

lecz tylko z poziomu Bitmapy, z której nie skorzystam

Image1.Picture.Bitmap.LoadFromResourceName

A chciałem uzyskać taki efekt:

 {Ikona stanu}
 with TImage.Create(Self) do
  begin
   Parent  := Self;
   Transparent := True;
   Left    := 15;
   Top     := 100;
   Name    := 'Image1';
   if Dllhan <> 0 then Picture.LoadFromResourceName(DllHan, 'nazwa_zasobu');
  end;
  FreeLibrary(DllHan);

Jak skorzystać z PNGImage i biblioteki DLL jako "paczki z grafiką png" ?

Dziękuję z góry za porady.

0

Ok, poradziłem sobie :)

var
 Dll: THandle;
 Png: TPngObject;
begin
 {Tworzenie zmiennej PNG}
 Png := TPngObject.Create;

 {Wczytanie biblioteki}
 Dll := LoadLibrary(pchar(ExtractFilePath(Application.ExeName) + 'images.dll'));
 
 {Wczytanie grafiki do TImage z PNG}
 with TImage.Create(Self) do
  begin
   Parent  := Self;
   Transparent := True;
   Left    := 15;
   Top     := 100;
   Name    := 'Image1';
   
   Png.LoadFromResourceName(Dll, 'grafika');
   Picture.Assign(Png);
  end; 

 {Zwolnienie zmiennej i biblioteki}
 FreeLibrary(Dll);
 Png.Free;
end;
0

O ile dobrze zrozumiałem to problem jest w tym że nie chcesz ładować poprzez bitmapę, a czy
może być tak? Testowałem i efekt jest chyba w porządku, ale nie wiem czy Tobie odpowiada?

Plk dllka.rc taki jak poniżej kompilujemy brcc32.exe:

cosik rcdata "test.png"

Plik dllka.dpr - to oczysicie tylko:

library dllka;

{$R dllka.res}

begin
end.

Kompilujemy dllke, a później w projekcie do uses dodajemy moduły ExtCtrls, PngImage; I kod:

var
  H : Thandle;
  Img : TImage;
  PNG : TPNGImage;
  Stream : TResourceStream;
begin
  H := LoadLibrary('dllka.dll');
  if H <> 0 then
     begin
     PNG := TPNGImage.Create;
     Stream := TResourceStream.Create(H, 'cosik', RT_RCDATA);
     PNG.LoadFromStream(Stream);
     with TImage.Create(Self) do
        begin
        Parent  := Self;
        Transparent := True;
        AutoSize := True;
        Left    := 15;
        Top     := 100;
        Name    := 'Image1';
        Picture.Assign(PNG);
        end;
     end;
end;

Ale dalej nie wiem czy o to chodziło, bo jako autor świetnego "Odkurzacza", pewnie znasz taką
metodę jaką zaprezentowałem w powyższym kodzie, bo dalej nie wiem czy o to Tobie chodzi? ;-/

EDIT: a już sobie poradziłeś, ale coś forum padało kilka razy i wysłałem tę odpowiedź dopiero kiedy
się dało, a Ty w tym czasie zdarzyłeś napisać odpowiedź. Czyli taki kod mniej więcej jak ten mój :)

0
olesio napisał(a)

Czyli taki kod mniej więcej jak ten mój :)

Zgadza się, ale bez użycia TResourceStream;
I nie zapominaj o zwalnianiu zmiennych i biblioteki ;-)

0

Ok, ale chyba używasz jakiegoś innego Image albo nowszej wersji Delphi, bo ja pod Delphi 7 i w
standardowym TImage nie mam w ogóle metody LoadFromResourceName, dlatego musze ładowąc
ze Streamu. Natomiast co do zwalniania biblioteki to oczywiście powinno się to robić, ale z moich
testów wynika że nawet jak załadujesz plik z dllki i jej nie zwolnisz to można operować na pliku dll.

0

Ale, po co tak się męczyć z dll, jak można dodać PNG do resources?
Potem dodajesz do uses: pngimage i przy tworzeniu formy robisz coś takiego:

(RT_Obrazek to przykładowa nazwa obrazka w zasobach)

var
 PNG: TPNGObject;
begin
  PNG := TPNGObject.Create;
  PNG.LoadFromResourceName(HInstance, 'RT_Obrazek') ;
  ImageObrazek.Picture.Assign(PNG);
  PNG.Free;

Wszystko.

0

...bo ja pod Delphi 7 i w standardowym TImage nie mam w ogóle metody LoadFromResourceName...

Bardzo dziwne, bo u mnie pod D7, LoadFromResourceName jest :-P

0

Zauważcie, że Opi używa LoadFromResourceName do TPngObject a nie do TImage.

0
pelsta napisał(a)

Zauważcie, że Opi używa LoadFromResourceName do TPngObject a nie do TImage.

ale olesio napisał

...w standardowym TImage...
:-P

0

A więc olesio coś nie zrozumiał...

0

Tak, teraz już wszystko jasne :)

0
entek napisał(a)

Ale, po co tak się męczyć z dll, jak można dodać PNG do resources?

Żeby stworzyć skórkę do każdej aplikacji która będzie potrafiła wczytać "moją" paczkę. Proste ;-)