2012-04-17 11 views
8

Mam kilka plików graficznych zapisanych w jednym pliku (jakiś rodzaj archiwum). Że plik wygląda tak:Strumień danych JPEG do TImage

enter image description here

dobrze, to rozdziela się na dwa segmenty - Nagłówek i dane segmentu. Nagłówek (zielony) zawiera różne informacje, takie jak nazwa albumu, lokalizacja, data/czas, opis, liczba zdjęć w albumie itp. Segment danych (niebieski & pomarańczowy) ma prostą strukturę i zawiera N x zdjęcie JPEG. Mogę wyodrębnić ten segment "Imagedata" do nowego obiektu TMemoryStream, a teraz chcę go pokazać za pomocą TImage.

Mogę użyć SaveAsFile metody TMemoryStream, ustawić tymczasową nazwę pliku, załadować ten plik z TImage, a później usunąć tymczasowy plik. To działa, ale zastanawiam się, czy istnieje sposób, aby wysłać ten strumień do TImage w/out przy użyciu temp. akta.

Oczywiście, mogę napisać kod, aby wyodrębnić wszystkie te pliki na dysku twardym, ale problem polega na tym, że mam wiele takich archiwów i po prostu chcę napisać aplikację, aby przeczytać te "albumy" zamiast mieć ponad 20 000 zdjęć na moim twardym dysku.

W skrócie, wszystko czego chcę to zrobić po procedura działa (w/przy użyciu temp. Pliki)

procedure ShowImageFromStream(data: TStream; img: TImage); 
begin 
... 
end; 

Dzięki z góry.

Odpowiedz

18

Nie jestem pewien, czy to jest to, czego szukasz, ale kod ten należy załadować plik JPEG z potoku do danego komponentu TImage:

uses 
    JPEG; 

procedure ShowImageFromStream(AImage: TImage; AData: TStream); 
var 
    JPEGImage: TJPEGImage; 
begin 
    AData.Position := 0; 
    JPEGImage := TJPEGImage.Create; 
    try 
    JPEGImage.LoadFromStream(AData); 
    AImage.Picture.Assign(JPEGImage); 
    finally 
    JPEGImage.Free; 
    end; 
end; 
+1

+1 nieznacznie diff nazwy var, ale tak samo jak Pisałem, muszę nauczyć się pisać szybciej. – Dampsquid

+2

MY BÓG, nawet ja użyłem TJPEGImage przed, całkowicie przegapiłem metodę LoadFromStream !? Wielkie dzięki, to wszystko. – Wh1T3h4Ck5

+0

Cieszę się, że pomogłem ;-) – TLama