Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TGraphicField JPGImage landen (https://www.delphipraxis.net/194527-tgraphicfield-jpgimage-landen.html)

ATS3788 3. Dez 2017 06:00

Datenbank: Firebird • Version: 3.0.2 • Zugriff über: firedac

TGraphicField JPGImage landen
 
Hallo
Ich spiele ein wenig herum
und da ist mir aufgefallen
das

Delphi-Quellcode:
/// Middle Picture
ImMid.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
DataModule1.FDMemTableImage2.LoadFromStream(Stream);
Stream.Clear;
Leider nur geht wenn der Stream eine Native Bitmap ist.

Bei
DBImageMid.Picture.Assign(ImLeft.Picture);
sieht man das Bild im JPG Format nur wenn man es speichern möchte
alsi im Edit Mode ist, wird es nicht gespeichert.
Geht das speichern in der Datenbank nur mit Bitmap Streams und nicht mit JPGs PNGs

Uwe Raabe 3. Dez 2017 07:07

AW: TGraphicField JPGImage landen
 
Aus Neuerungen in Delphi Tokyo:
Zitat:

Direkte Unterstützung von VCL-TDBImage für JPEG- und PNG-Grafikformate.

ATS3788 3. Dez 2017 14:46

AW: TGraphicField JPGImage landen
 
Hallo Uwe
Danke für Deine Antwort.
ich verstehe nicht ich habe nur XE7 Pro und geht das damit oder nicht wenn nich konvertiere ich das eben alles in eine Bitmap.

Uwe Raabe 3. Dez 2017 15:32

AW: TGraphicField JPGImage landen
 
Nein, das geht erst ab Delphi 10.2 Tokyo.

ATS3788 3. Dez 2017 15:57

AW: TGraphicField JPGImage landen
 
Danke Uwe
Einen schönen 1 Advents Sonntag wünsche ich Dir

ATS3788 6. Dez 2017 07:22

AW: TGraphicField JPGImage landen
 
Lieber Uwe ich habe da noch ein wenig rumgebastelt und
das kam dabei raus
Delphi-Quellcode:

var
Stream  : TMemoryStream;
JpgImage : TJpegImage;


begin
try
Stream := TMemoryStream.Create;
JpgImage := TJpegImage.Create;
case _DatasetMode of
dsm_Insert: DataModule1.FDMemTable.Edit;
dsm_Append: DataModule1.FDMemTable.Append;
end;
/// Left Picture
ImLeft.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
DataModule1.FDMemTableGraficBlob1.LoadFromStream(Stream);

/// Middle Picture
ImMid.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
DataModule1.FDMemTableGraficBlob2.LoadFromStream(Stream);
Stream.Clear;

/// Middle Picture
ImRight.Picture.Graphic.SaveToStream(Stream);
Stream.Position := 0;
DataModule1.FDMemTableGraficBlob3.LoadFromStream(Stream);
Stream.Clear;

DataModule1.FDMemTableGraficBlob1.SaveToStream(Stream);
Stream.Position := 0;
JpgImage.LoadFromStream(Stream);

DBImageLeft.Picture.Assign(JpgImage);

DataModule1.FDMemTableGraficBlob2.SaveToStream(Stream);
Stream.Position := 0;
JpgImage.LoadFromStream(Stream);

DBImageMid.Picture.Assign(JpgImage);

DataModule1.FDMemTableGraficBlob3.SaveToStream(Stream);
Stream.Position := 0;
JpgImage.LoadFromStream(Stream);

DBImageRight.Picture.Assign(JpgImage);


  PageControl1.TabIndex := 0;
finally
JpgImage.Free;
   Stream.Free;
end;
Ich speichere die Grafikdaten in einem gewöhnlichen Blob und lade sie
mit einem Stream nach TJPEGImage und dann in ein TImage.
Kann man das so machen oder ist das nicht sinnvoll

Redeemer 6. Dez 2017 09:16

AW: TGraphicField JPGImage landen
 
Ist nicht sinnvoll, wenn unterschiedliche Dateitypen gespeichert werden. Solange du da nur JPEGs drin hast, mag das gehen.

Der Compiler wird meckern, denn Create gehört vor try.

DeddyH 6. Dez 2017 10:05

AW: TGraphicField JPGImage landen
 
Genau, ich würde es so schreiben (Geschmackssache, aber ich versuche verschachtelte Ressourcenschutzblöcke zu vermeiden):
Delphi-Quellcode:
JpgImage := nil;
Stream := TMemoryStream.Create;
try
  JpgImage := TJpegImage.Create;
  {... Code}
finally
  JpgImage.Free;
  Stream.Free;
end;
Und wenn man andere Grafikformate unterstützen möchte, sollte man sich das Format zusätzlich abspeichern (Dateiendung, MIME-Type, Fremdschlüssel auf eine Formatdefinitionstabelle oder oder oder), das sollte auch funktionieren, wenn man sorgfältig arbeitet.

ATS3788 6. Dez 2017 11:10

AW: TGraphicField JPGImage landen
 
Super Danke DaddyH:thumb:

Uwe Raabe 6. Dez 2017 11:12

AW: TGraphicField JPGImage landen
 
Alternativ zum Umweg über den MemoryStream kann man sich auch gleich vom DataSet einen BlobStream geben lassen: CreateBlobStream

Delphi-Quellcode:
var
  stream: TStream;
  JpgImage: TJpegImage;
begin
  { Image in BlobField schreiben }
  stream := DataModule1.FDMemTable.CreateBlobStream(DataModule1.FDMemTableGraficBlob1, bmWrite);
  try
    ImLeft.Picture.Graphic.SaveToStream(stream);
  finally
    stream.Free;
  end;

  { Image aus BlobField lesen }
  JpgImage := TJpegImage.Create;
  try
    stream := DataModule1.FDMemTable.CreateBlobStream(DataModule1.FDMemTableGraficBlob1, bmRead);
    try
      JpgImage.LoadFromStream(Stream);
    finally
      stream.Free;
    end;

    ...

  finally
    JpgImage.Free;
  end;
end;
OT:
Zitat:

ich versuche verschachtelte Ressourcenschutzblöcke zu vermeiden
Das saubere Trennen der Schutzblöcke für jede Resource erleichtert allerdings das Refactoring ungemein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz