Avatar billede delphi Nybegynder
27. juni 2001 - 13:38 Der er 7 kommentarer og
1 løsning

Hvorfor kan jeg ikke streame JPEG ligesom Bitmaps?

Hvis jeg skriver TBitmaps til en Stream, så kan jeg uden problemer læse dem tilbage igen.  Dette gør jeg således:


S = En eller anden stream (TMemoryStream, TFileStream  uvæsentligt)

Var
  BitMap : TBitmap;
  x      : Integer;
Begin
  // Gem en masse Bitmaps i stream.
  BitMap := TBitmap.Create;
  Try
    S.Position := 0;

    For X := 1 To SomeNumberOfBitmaps Do
      Begin
        BitMap.LoadFromFile(\'BitMap no.\'+IntToHex(X, 4),\'.Bmp\';

        BitMap.SaveToStream(S);
      End;
  Finally
    BitMap.Free;
  End;


  // Hent en masse Bitmaps fra stream.
  BitMap := TBitmap.Create;
  Try
    S.Position := 0;
    For X := 1 To SomeNumberOfBitmaps Do
      Begin
        BitMap.LoadFromStream(S);

        BitMap.SaveToFile(\'BitMap no.\'+IntToHex(X, 4),\'.Bmp\';
      End;
  Finally
    BitMap.Free;
  End;

Dette virker fint (forudsat at jeg nu har skrevet syntaxen korrekt - det er lige ud af hånden)

Hvis vi så erstatter alle Bitmap (TBitMap) referencer i det ovenstående til JPEG (TJPEGImage), og husker at USES JPEG, så burde det ifølge mit lille hovede virker ligeså fint.
Det gør det bare ikke.
Første gang jeg læser en JPEG fra streamen, så kan jeg se at position bliver flyttet frem (en ca. 200 kByte, hvilket virker fint i forhold til den størrelse filer jeg arbejder med). men der bliver tilsyneladende ikke lagt noget image ind i JPEG komponenten.  Anden gang jeg læser fra streamen i loopen går lortet ned med en Exception (Access violation).

Hvad hulen går der galt her?


Peter
Avatar billede martinlind Nybegynder
27. juni 2001 - 13:47 #1
Mærkeligt for det virker den anden vej, fra ISAPI demo\'en :

procedure TCustomerInfoModule.CustomerInfoModuleGetImageAction(
  Sender: TObject; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
var
  Jpg: TJpegImage;
  S: TMemoryStream;
  B: TBitmap;
begin
  Jpg := TJpegImage.Create;
  try
    B := TBitmap.Create;
    try
      B.Assign(BioLifeGraphic);
      Jpg.Assign(B);
    finally
      B.Free;
    end;
    S := TMemoryStream.Create;
    Jpg.SaveToStream(S);
    S.Position := 0;
    Response.ContentType := \'image/jpeg\';
    Response.ContentStream := S; // do not free the stream because the response
                                // object will handle that task.
  finally
    Jpg.Free;
  end;
end;
Avatar billede delphi Nybegynder
27. juni 2001 - 13:49 #2
Jeps, her gemmer du i en stream.... 
Jeg vil ha mine data ud igen. 

Peter
Avatar billede martinlind Nybegynder
27. juni 2001 - 13:54 #3
Ja det forstod jeg, derfor MÆRKELIGT Hmmm mystisk
......

Har ikke lige nogle ide\'er, du kan evt. prøve www.mellander.dk han har lavet en udvidet Image comp. jeg kan ikke lige huske om den har JPG support.
Avatar billede delphi Nybegynder
29. juni 2001 - 14:55 #4
Jeg har haft spørgsmålet posted i Borland.public.delphi.graphics og har der fået den noget nedslående melding:

***********************
> This is why I would assume that the object it self must load the
> correct number of bytes.

That is the incorrect assumption (cfr my other mail). I do agree that it
should have been a valid assumption, I do agree that we are talking
about a graphics.pas / jpeg.pas bug here.
***********************

TJPEGImage\'s kan, p.g.a. \'fejl\' i Graphics.Pas og JPEG.Pas, simpelt hen ikke finde ud af at loade sig selv fra en stream, der indeholder mere end en frame.  Trals, så istedet må jeg enten gemme i en stribe streams eller enkelte filer (med henholdsvis JPEG.SaveToStream og JPEG.SaveToFile).


Lukker derfor spørgsmålet.


Peter
Avatar billede delphi Nybegynder
29. juni 2001 - 14:57 #5
Martin, hvis du banker et svar op inden Mandag kan du få en håndfuld point for besværet, ellers lukkes det....
Avatar billede martinlind Nybegynder
29. juni 2001 - 16:24 #6
Tyndt, det må man sige, der er sku da næsten basis for at lave et hack af en eller anden slag, så lortet kommer til at virke, du har ikke prøvet i D6 vel ?
Avatar billede delphi Nybegynder
30. juli 2001 - 12:02 #7
Jeg har lukket spørgsmålet.  I følge mine oplysninger, så har Borland lavet TJPEGImage componenten således at den ikke kan streames, dvs. det kan den godt, men når man læser den fra en stream, så antages det, at hele streamen består af image data, hvorfor hele streamen indlæses.  Først når dette er sket, decodes dataene og JPG-imaget opbygges. 
Jeg vil mene at man kan kalde det en bug, at hele streamen indlæses, selvom image dataene kun fylder en brøkdel, og at stream pointeren ovenikøbet efterlades ved EOF istedet for at blive tilbage stillet til \'korrekt\' position, men så\'en er livet....

Peter
Avatar billede martinlind Nybegynder
30. juli 2001 - 12:13 #8
Så kan du vel bare kode et hack, der loader ind i en tmp stream som kun indeholder imagedata
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester