Oppure

Loading
06/08/11 23:46
Track
Salve a tutti, come da titolo, mi piacerebbe sapere se è possibile salvare in Jpeg nello stream un immagine presente su un image1 :)
aaa
07/08/11 9:23
Goblin
Vediamo se ho capito ...
Per utilizzare lo stream devi andare a beccare la classe graphics, sotto un piccolo esempio

Var oStm:TMemoryStream;
begin
  oStm:= TMemoryStream.Create;
  Try
    Image1.Picture.Graphic.SaveToStream(oStm);
    // Uso stream per salvare l'immagine
    oStm.SaveToFile('c:\file\test.jpg');
  Finally
    oStm.Free;
  End;


G.
Ibis redibis non morieris in bello
07/08/11 13:21
Nullable
Se il codice dovesse essere come quello di Goblin ( non conosco il Delphi ) allora quando vai a richiamare SaveToFile sei tu a decidere l'estensione dell'immagine, il programma ti salverà quell'immagine con l'estensione scelta da te quindi sì che è possibile.
Ultima modifica effettuata da Nullable 07/08/11 13:22
aaa
12/08/11 19:01
Goblin
Allora ..
L'oggetto oStm è dichiarato dentro una procedura come variabile locale, e dentro la procedure nasce, vive e muore.
Se vogliamo un oggetto memory stream a livello di applicazione abbiamo molteplici strade da seguire:
1) variabile globale (BRRRR orrore)
2) Variabile public/protected/private della classe mainform (quasi accettabile)
3) Oggetto dentro un Datamodule contenente oggetti che viene creato all'inizio del programma e distrutto alla fine (ottimo compromesso)
4) Variabile locale della procedura (uso e consumo "ad hoc)
Dunque per rispondere alla tua domanda, nel caso 1,2,3 se lo stream viene caricato è sempre presente in tutto il programma e l'immagine (contenuto) è sempre a disposizione, sino a quando non viene fatto un clear o un free, nel caso 4 una volta usciti dalla procedura la variabile stream viene persa.
Spero di essere stato abbastanza chiaro :)
G.

NB: ricordo che ad ogni create corrisponde un free ......
Ultima modifica effettuata da Goblin 12/08/11 19:13
Ibis redibis non morieris in bello
14/08/11 19:29
Goblin
allora .. in base alla richiesta di Track posto 2 righe di come farei io in un applicazione con solo 1 form, in quanto ho deciso di utilizzare una variabile public della form.
la form è semplice 2 componenti TImage (image1 sorgente e image2 destinazione), 2 Tbutton (button1 carica nello stream button2 scarica dallo stream al componente image).
Ho deciso di discernere i tipi di immagine dunque nelle uses bisogna aggiungere jpeg,pngimage in modo da gestire oltre le bmp anche png e jpeg(jpg)

dichiaro la variabile.
  public
    foStreamImage: TMemoryStream;


creazione e distruzione oggetto stream
procedure TForm1.FormCreate(Sender: TObject);
begin
  foStreamImage := TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(foStreamImage) then
    FreeAndNil(foStreamImage);
end;


Button1click carico nello stream l'immagine
procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.Graphic.SaveToStream(foStreamImage);
end;


button2click scrivo lo stream in image scegliendo il tipo di immagine
procedure TForm1.Button2Click(Sender: TObject);
var
  FirstBytes: AnsiString;
  Graphic: TGraphic;
begin
  Graphic := nil;
  Screen.Cursor := crHourGlass;
  Image2.Picture := Nil;
  foStreamImage.Seek(0, soFromBeginning );  // reset stream
  try
    SetLength(FirstBytes, 8);
    foStreamImage.Read(FirstBytes[1], 8);
    if Copy(FirstBytes, 1, 2) = 'BM' then
      Graphic := TBitmap.Create
    else if FirstBytes = #137'PNG'#13#10#26#10 then
      Graphic := TPngImage.Create
    else if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
      Graphic := TJPEGImage.Create;
    if Assigned(Graphic) then
    begin
      try
        foStreamImage.Seek(0, soFromBeginning );
        Graphic.LoadFromStream(foStreamImage);
        Image2.Picture.Assign(Graphic);
      except
       // gestione eccezione
      end;
    end
    else
      ShowMessage('Formato immagine non riconosciuto');
  finally
    Screen.Cursor := crDefault;
    Graphic.Free;
  end;
  Image2.Refresh;
end;


..... il tutto ovviamente è migliorabile per mezzo di una property con funzioni get/set in modo da evitare il button1 ... lo lascio come compito per le vacanze a chi lo vuole svolgere :)
un saluto e spero di non aver detto troppe cavolate
G.
Ultima modifica effettuata da Goblin 14/08/11 19:35
Ibis redibis non morieris in bello