Obrazki JPG z zasobów

Adam Boduch

Domyślnie podczas korzystania z plików JPG używasz klasy TJPEGImage. Ta klasa nie posiada niestety procedury LoadFromResource, która pozwalała by na odczyt plików JPG z zasobów. Trzeba taką klasę napisać samemu. Nie jest to jednak nic trudnego, o czym sam niebawem się przekonasz...

Do kompilacji zasobów będzie Ci potrzebny program brcc32.exe, który jest dołączony do Delphi. Nie będę tutaj jeszcze raz omawiał procesu kompilacji zasobów przy pomocy tego programu. Radzę poczytać artykuły o zasobach w dziale Delphi jeżeli tego nie wiesz.

W każdym bądz razie stwórz plik files.rc i wpisz do niego taką oto treść:

PIC JPEGFILE "sfp.jpg"

Pierwszy człon do nazwa obraza, kolejny do jego typ, a ostatni w cudzysłowach to nazwa pliku, który zostanie włączony do zasobów. Teraz musisz skompilować plik do postaci RES. Pierwszą część już mamy, ale Ciebie zapewne interesuje proces wyciągania tego z zasobów.

Pierwsze co musisz robić to dodać do listy uses plik jpeg. Teraz zadeklaruj taką oto klasę:

{ klasa dziedziczaca z TJPEGImage, ktora posiada jedna dodatkowa
  funkcje ladowania z zasobow } 
  TJPEGRes = class(TJPEGImage)
  public
    procedure LoadFromResource(const ResID: PChar); virtual;
  end;

Prosta, klasa, która dziedziczy z klasy TJPEGImage. Posiada dodatkowo jedną ważną dla nas procedurę, czyli LoadFromResource. Ta procedura będzie wyglądała tak:

procedure TJPEGRes.LoadFromResource(const ResID: PChar);
var
  Res : TResourceStream; // utworz zmienna
begin
{ zalduj obrazek z zasobow }
  Res := TResourceStream.Create(hInstance, ResID, 'JPEGFILE');
  try
    LoadFromStream(Res); // laduj obrazek do strumienia ze zmiennej Res
  finally
    Res.Free;  // zwolnij pamiec
  end;
end;

Jak mówiłem nie jest to trudne. Na początek tworzysz zmienną TResourceStream, a konkretnie wywołujesz jej konstruktor. W konstruktorze musi być zawarte: uchwyt - w naszym wypadku odwołujemy się do rejestru. Kolejny parametr to nazwa zasobu, a ostatni to typ zasobu umieszczony w pliku. Ta komenda powoduje "wyciągnięcie" i przpisanie do Res naszego pliku JPG. Teraz pozostaje już wywołać procedurę LoadFromStream z klasy TJPEGImage, która pobierze dane ze strumienia REs. to wszystko! Taki mały kod robi wszystko o co nam chodzi - odczytuje z zasobów obrazek!

Teraz pozostaje tylko użycie tej klasy - oto przykład:

procedure TMainForm.btnLoadResClick(Sender: TObject);
var
  JPG : TJPEGRes;
begin
  JPG := TJPEGRes.Create; // tworzenie nowej klasy
  try
    JPG.LoadFromResource('PIC'); // zaladowanie odpowiedniego zasobu 
    Canvas.Draw(10, 10, JPG); // wyswietlenie obrazka
  finally
    JPG.Free;
  end;
end;

"PIC" to nazwa zasobu, który został skompilowany, prawda? Po załadowaniu pozostaje skorzystanie z Canvas'u i wyświetlenie na formie obrazka.


albo
wrzucasz komponent Image i w kategorii picture wybierasz plik :)

3 komentarzy

a nie lepiej użyć Image i wybrać plik poprostu
a spróbój zapisać 20 jpg na image :) co najmniej nie praktyczne...

a nie lepiej użyć Image i wybrać plik poprostu

nawet spox....