Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi JPG in TBlobField (https://www.delphipraxis.net/30635-jpg-tblobfield.html)

Poolspieler 27. Sep 2004 14:14


JPG in TBlobField
 
Hallo,
ich möchte in einem Blobfeld meiner Accessdatenbankverbindung (Jet 4.0 OLE) Screenshots speichern.

Code:
  DataModule1.kunde.Edit;
  DataModule1.kundeWegbeschreibung.Assign(bild.Picture); // bild ist ein TImage
  DataModule1.kunde.Post;
Das Problem bei obigem Code ist allerdings, dass "bild" anscheinend im Bitmapformat vorliegt - dass heißt, für jeden Datensatz, der ein Bild enthält, werden knapp 1MB verbraten!!! Da ich mit bis zu 100 000 Datensätzen (und mehr) rechne, ist das nicht wirklich befriedigend...

Kann mir jemand sagen, wie ich in einem TBlobfeld eine Grafik im JPEG-Format speichern kann?

Gruß und danke

Poolspieler

Union 27. Sep 2004 14:23

Re: JPG in TBlobField
 
Zitat:

Zitat von Poolspieler
Hallo,
ich möchte in einem Blobfeld meiner Accessdatenbankverbindung (Jet 4.0 OLE) Screenshots speichern.

Code:
  DataModule1.kunde.Edit;
  DataModule1.kundeWegbeschreibung.Assign(bild.Picture); // bild ist ein TImage
  DataModule1.kunde.Post;
Das Problem bei obigem Code ist allerdings, dass "bild" anscheinend im Bitmapformat vorliegt - dass heißt, für jeden Datensatz, der ein Bild enthält, werden knapp 1MB verbraten!!! Da ich mit bis zu 100 000 Datensätzen (und mehr) rechne, ist das nicht wirklich befriedigend...

Kann mir jemand sagen, wie ich in einem TBlobfeld eine Grafik im JPEG-Format speichern kann?

Gruß und danke

Poolspieler

Verwende TJpegImage:
Delphi-Quellcode:
jp := TJpegImage.create;
jp.Assign(bild.Picture);

Poolspieler 27. Sep 2004 14:31

Re: JPG in TBlobField
 
Hi,
ich möchte aber erstmal das vorhandene bild (also den Screenshot) IN die Datenbank schreiben, wobei bei unten stehenden Code eine Exception ausgelöst wird:
EInvalidGraphic --> Bitmap ist ungültig

Delphi-Quellcode:
var
   quelle, ziel_bild: TRect;
   bild: TImage;
   jpg: TJPEGImage;
begin
  bild := TImage.Create(self);
  bild.Width := WebBrowser1.Width;
  bild.Height := WebBrowser1.Height;

  quelle.Left := WebBrowser1.Left;
  quelle.Top := WebBrowser1.Top;
  quelle.Right := WebBrowser1.Width + WebBrowser1.Left;
  quelle.Bottom := WebBrowser1.Height + WebBrowser1.Top;

  ziel_bild.Left := 0;
  ziel_bild.Top := 0;
  ziel_bild.Right := WebBrowser1.Width;
  ziel_bild.Bottom := WebBrowser1.Height;

  // hier wird der eigentliche Screenshot meines Progammfensters gemacht
  bild.Canvas.CopyRect(ziel_bild, Hauptfenster.wegbeschreibung.Canvas, quelle);

  // Umwandlung des obigen Screenshots in ein jpg
  jpg := TJPEGImage.Create;
  jpg.Performance := jpBestQuality;
  jpg.CompressionQuality := 80;
  jpg.Assign(bild.Picture.Graphic);

  // speichern des JPG in die Datenbank --> des geht aber irgendwie net ;-((
  DataModule1.kunde.Edit;
//  DataModule1.kundeWegbeschreibung.Assign(bild.Picture); // so würde es gehen, aber mit viiiel zu großen Datensätzen...
  DataModule1.kundeWegbeschreibung.Assign(jpg); // HIER kommt die Exception **********************************************!!!!!
  DataModule1.kunde.Post;
end;
Ich hoffe, Du verstehst jetzt mein Problem (beim ersten Versuch wollte ich euch nur den gesamten Code ersparen...

Gruß

Poolspieler

Union 27. Sep 2004 14:47

Re: JPG in TBlobField
 
Zitat:

Zitat von Poolspieler
Hi,
ich möchte aber erstmal das vorhandene bild (also den Screenshot) IN die Datenbank schreiben, wobei bei unten stehenden Code eine Exception ausgelöst wird:
Delphi-Quellcode:
var
  DataModule1.kundeWegbeschreibung.Assign(jpg); // HIER kommt die Exception end;
Ich hoffe, Du verstehst jetzt mein Problem (beim ersten Versuch wollte ich euch nur den gesamten Code ersparen...

Gruß

Poolspieler

Wie ist denn das Blob-Feld definiert (BlobType) ? Ich glaube das Assign beim ftGraphic unterstützt nur Bitmaps. Und da Du kein Bitmap sondern ein Jpeg assignesd, knallt es. Versuche es doch mit Streams. (TMemoryStream.Create, jpg.SaveToStream(MemStream), kundeWegBeschreibung.LoadFromstream(MemStream))

Poolspieler 27. Sep 2004 14:52

Re: JPG in TBlobField
 
fieldtype ist fkData
und
blobtype ist ftBlob

mit einem Memorystream hab ich es auch schon mal probiert, aber auch da hat es von mysteriösen Exceptions nur so gehagelt... :cry:

Als es mit Bitmap funktioniert hab ich mich erstmal gefreut (bis ich die Dateigröße entdeckte...)


--> Gibt es irgendwo vielleicht ein brauchbares Beispiel zum Memorystream?

Gruß

Poolspieler

Union 27. Sep 2004 15:17

Re: JPG in TBlobField
 
Zitat:

Zitat von Poolspieler
fieldtype ist fkData
und
blobtype ist ftBlob

mit einem Memorystream hab ich es auch schon mal probiert, aber auch da hat es von mysteriösen Exceptions nur so gehagelt... :cry:

Als es mit Bitmap funktioniert hab ich mich erstmal gefreut (bis ich die Dateigröße entdeckte...)


--> Gibt es irgendwo vielleicht ein brauchbares Beispiel zum Memorystream?

Gruß

Poolspieler

So geht's:

Delphi-Quellcode:
      bild.Canvas.CopyRect(tr, Canvas, tr);
      jpg.Assign(bild.Picture.Graphic);
      jpg.Compress;

      jpg.SaveToStream(ms);

      tblPicture.Edit;
      tblPictureGrafik.LoadFromStream(ms);
      // Nur als Nachweis, dass im jpg-Objekt auch wirklich was gespeichert ist
      jpg.SaveToFile('c:\temp\test.jpg');
      tblPicture.Post;

Poolspieler 27. Sep 2004 15:27

Re: JPG in TBlobField
 
Hi,
danke für Deine Antwort, doch leider kommt immernoch die selbe Fehlermeldung bei folgendem Befehl:
Delphi-Quellcode:
  DataModule1.kundeWegbeschreibung.LoadFromStream(ms);
Zitat:

Bitmap ist ungültig
:wall:

--> in test.jpg ist die korrekte Grafik...

Fällt noch jemandem was ein? :pale:

Union 27. Sep 2004 15:30

Re: JPG in TBlobField
 
[quote="Poolspieler"]Hi,
danke für Deine Antwort, doch leider kommt immernoch die selbe Fehlermeldung bei folgendem Befehl:
Delphi-Quellcode:
  DataModule1.kundeWegbeschreibung.LoadFromStream(ms);
Zitat:

Bitmap ist ungültig
Ich habe den obigend Code nicht einfach so hingeschrieben, sondern in einem Beispielprojekt getestet. Bei mir bläht er fleissig die Datenbank auf, es kommt auch keine Fehlermeldung.

franktron 27. Sep 2004 15:39

Re: JPG in TBlobField
 
Was für ein Blob ist denn das in der DB und ist da vieleicht ein TDBImage dran oder sowas.

Hier noch mal der ganze code um daten in ein Blob Feld zu schreiben.

Delphi-Quellcode:
Var
 Stream : TStream;
Begin
  STREAM:=Table.CreateBlobStream(FieldByName('blob'),bmWrite);
  Try
    Stream.LOadFormFile('bild.jpg'); //Mann kann auch den JPG Stream Hierher Kopieren.
  finally
    Stream.Free;
  End;
End;

Poolspieler 28. Sep 2004 11:03

Re: JPG in TBlobField
 
Hi,
ich habs jetzt aufgegeben :?
Es funktioniert wahrscheinlich nicht, weil es im Hintergrund eine mistige Accessdatenbank ist. In diese Datenbank habe ich für das Feld "OLE-Objekt" angegeben. Und genau dieses OLE-Objekt kann wahrscheinlich kein JPG :wall:

Ich hab jetzt aber auch keine Lust mehr, mich mit diesem leidigen Thema zu beschäftigen und bin deshalb auf eine Notlösung umgestiegen:
Ich habe einfach ein Verzeichnis angelegt, in dem ich die Bilder speichere - und bei jedem Anzeigen eines neuen Datensatzes lade ich eben das (eventuell vorhandene...) Bild.

Einziges Problem dieser Methode:
Windoofs ist ja auf 32000 Dateien in einem Verzeichnis beschränkt - aber dann muss ich halt noch mit Unterverzeichnissen arbeiten...

Gruß und danke für eure Antworten

Poolspieler


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 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