Pliki graficzne w pliku i ich obsługa

0

Mam do obsługi ok. 300 plików *.PNG.
Problem w tym, że nie chce, by uzytkownik mial do nich dostep, wiec musze je wpakowac do jednego pliku (chociazby *.spr). Drugi problem polega na tym, że:

  1. Nie wiem, jak zrobić plik SPR i to z formatem PNG
  2. Nie wiem, jak otworzyć plik i wyszukać odpowiednią grafik

Szukalem wszedzie, nawet Google nie dalo rady : /
Probówałem pod hasłami z konwersją, z grafiką w jednym pliku i nic ...

0

Zasoby

0

instalujesz
Portable Network Graphics for Delphi

uses  PngImage;

Zapisujesz w zasobach jako RT_RCDATA
Do Wypakowania używasz procedury :

 Procedure LoadPngRes(ResName:PChar; var Png:TPngObject);
var 
Res:TResourceStream;
begin
   Res := TResourceStream.Create(hInstance, ResName, RT_RCDATA);
   Png.LoadFromStream(Res);
   Res.free;
end;
var 
RysunekPng:TPngObject;

Gdzieś w Programie :

RysunekPng:= TPngObject.Create;
LoadPngRes('NazwaZasobu',RysunekPng);  // Ładujesz z zasobów wywołując procedurke

//Robisz co chcesz np rysujesz hehee
Canvas.Draw(0,0,RysunekPng);

// Zwalniasz na końcu pracy
RysunekPng.Free;
0

Oprócz zasobów zawsze możesz stworzyć swój "mini" format pliku z danymi.

Może to wyglądać np tak:

 
 |   Nagłówek pliku, stała ilość bajtów   ||  Indeks plików, stała ilość bajtów ||                    |
 |<-  Odczytujesz to do rekordu poprzez ->||<- Odczyt pętlą do 2 tabel string ->||<- Tutaj grafika  ->|
 |     jakiś BlockRead czy coś takiego    ||              i integer             ||                    |
 [Nazwa pliku zasobu][Wersja][Ilość grafik][Nazwa grafiki #n][Rozmiar grafiki #n][Binarne dane grafiki] 
 [        50b       ][  4b  ][     4b     ][      16b       ][         4b       ][   Tyle ile trzeba  ]
 [Mój zasób jakiś   ][     1][           3][Grafika nr 1    ][             85473][....................]

Rozmiary poszczególnych bloków są podane tylko dla przykładu. Na przykładzie takiego formatu, aby odczytać grafikę nr 5 należy zsumować rozmiary grafik numer 1, 2, 3 i 4 (licząc od 1) do otrzymanej liczby dodać wielkość nagłówka (w tym wypadku 58b) oraz wielkość indeksu (w tym wypadku ilość grafik razy 20b) ustawia się wskaźnik pliku na otrzymaną wartość. Ilość bajtów do odczytania jest w tablicy indeksu - pole rozmiar grafiki. Można by się pokusić i do indeksu zawartości podać oprócz nazwy i rozmiaru jeszcze offset od początku pliku (coś co wyżej było liczone) - zaoszczędzi to czasu przy wielokrotnych odczytach, a policzyć trzeba tylko raz zapisując.

0

Pytanie za 100 pkt.
Jak wyświetlić ten PNG w image3 ?

Przy takim czymś:

zasoby :=TResourceStream.Create(hinstance, 'warrior_armor', RT_RCDATA);
 //tworzymy strumień
Image3.Picture.Graphic := TPngObject.Create; //tworzymy obraz
image3.Picture.Graphic.LoadFromStream(zasoby);  //ładujemy
zasoby.free; //zwalniamy

wywala błąd:
This operation is not valid because the current image contains no valid header

Czyli wtf ?

0

@Odswiezam (po 48h)

0

Pamiętaj, że odświeżanie jest oznaką braku kultury na forum. To jak stwierdzenie 'sorry, inni forumowicze - mój post jest ważniejszy od waszych'. Skoro nikt nie odpowiedział to być może nie wie/nie chce/nie zaglądał/nie ma ochoty.

Jak z każdym prawie tematem na forum, tutaj też nasuwa się odpowiedź: było szukaj!

1 użytkowników online, w tym zalogowanych: 0, gości: 1