![]() |
Welche Art von Grafik wurde gespeichert
Guten Tag,
ich habe in einem Blob-Feld eine Grafik gespeichert. Die Grafik will ich nun wieder auf die Festplatte speichern.
Delphi-Quellcode:
TabellenName.FieldByName('grafik').SaveToFile('D:\grafikname.???)
Wie kann bestimmt werden welche Art von Grafik (png, bmp usw...) gespeichert werden soll, wenn nicht mehr bekannt ist, um welche Art von Grafik es sich handelt? Vielen Dank für Eure Hilfe. |
AW: Welche Art von Grafik wurde gespeichert
.. Du könntest die File-Signatur auswerten: ->
![]() Grüße Klaus |
AW: Welche Art von Grafik wurde gespeichert
Jede Graphic-Klasse hat eine überladene class function CanLoadFromStream, die die von Klaus in Spiel gebrachte Idee umsetzt.
Das kannst dann verwenden, um aus dem Blob-Stream zu ermitteln, welche File-Extension gebraucht wird.
Delphi-Quellcode:
uses Vcl.Graphics, Vcl.Imaging.pngimage, Vcl.Imaging.jpeg, Vcl.Imaging.GIFImg; function GetImageFileExtensionFromBlobStream(const ABlobStream: TStream): string; begin if TBitmap.CanLoadFromStream(ABlobStream) then begin Result := 'bmp'; end else if TPngImage.CanLoadFromStream(ABlobStream) then begin Result := 'png'; end else if TJPEGImage.CanLoadFromStream(ABlobStream) then begin Result := 'jpg'; end else if TGIFImage.CanLoadFromStream(ABlobStream) then begin Result := 'gif'; end else Result := 'unknown'; end; |
AW: Welche Art von Grafik wurde gespeichert
Danke, wieder was gelernt :o)
|
AW: Welche Art von Grafik wurde gespeichert
Vielen Dank für die Hilfestellung,
wenn ich die function von TiGü einsetze erhalte ich immer als Extension "bmp" ob wohl eine png-Datei von mir gespeichert wurde.
Delphi-Quellcode:
var
pExtension: string; pMStream: TMemoryStream; pAdressID: Int64; begin // MvST ----------------------- pAdressID := LeseAdressID(1); dtmdMain.ibqryEineUnterschrift.Close; dtmdMain.ibqryEineUnterschrift.ParamByName('pAdressID').Value := pAdressID; dtmdMain.ibqryEineUnterschrift.Open; pMStream := TMemoryStream.Create(); try pMStream.Position := 0; dtmdMain.ibqryEineUnterschriftUTSCHRIFTBRD.SaveToStream(pMStream); pExtension := GetImageFileExtensionFromBlobStream(pMStream);// Code von TiGü Showmessage(pExtension); // <<löschen nicht vergessen finally pMStream.Position := 0; pMStream.Free; dtmdMain.ibqryEineUnterschrift.Close; end; // --------------------------------- dtmdMain.sqlKopiereUnterschrift.Close; dtmdMain.sqlKopiereUnterschrift.ParamByName('pAdressID').Value := pAdressID; dtmdMain.sqlKopiereUnterschrift.ExecQuery; dtmdMain.sqlKopiereUnterschrift.FieldByName('utschriftbrd').SaveToFile(GlobalPfad + AnmeldeName + '\uschrmvst.' + pExtension); dtmdMain.sqlKopiereUnterschrift.Close; Was mache ich falsch? |
AW: Welche Art von Grafik wurde gespeichert
.. wie wird denn die Grafik als Blob abgespeichert?
Grüsse Klaus |
AW: Welche Art von Grafik wurde gespeichert
Die Grafik speichere ich so:
Im Value wird der Pfad und der Name der Datei übergeben: z.B.: "d:\VerzeichnisName\name_der_datei.png"
Delphi-Quellcode:
procedure TOAdressen.SetUSchrBruder(const Value: string);
begin dtmdMain.DoStartTransaction; dtmdMain.adressen.Edit; if Value <> '' then dtmdMain.adressenUTSCHRIFTBRD.LoadFromFile(Value) else dtmdMain.adressenUTSCHRIFTBRD.Clear; dtmdMain.adressen.Post; end; |
AW: Welche Art von Grafik wurde gespeichert
.. mhm,
kannst Du mal debuggen und schauen was in Deinem Stream steht? Eine Konvertierung von png/jpg nach bmp wird nirgends vorgenommen? Grüße Klaus |
AW: Welche Art von Grafik wurde gespeichert
Genau, direkt nach dtmdMain.adressenUTSCHRIFTBRD.LoadFromFile(Value) einfach mal in einen Stream zurück laden und der Funktion vorwerfen.
Ggf. ein bisschen mit der Reihenfolge der If-Abfragen spielen, also TPngImage.CanLoadFromStream(ABlobStream) zuerst. |
AW: Welche Art von Grafik wurde gespeichert
Vielen Dank Euch beiden.
Mit dem zusätzlichen Tipp von TiGü hat es geklappt. Also neueinlesen und dann an die Funktion übergeben. |
AW: Welche Art von Grafik wurde gespeichert
TPicture hat seit ein paar wenigen Jahren endlich auch in der LoadFromStream einen Code drin, welcher die Magic-Bytes prüft,
entsprechend dem CanLoadFromStream. (für alle TGraphic-Typen, welche registriert sind, also wo die Units eingebunden sind) Früher ging LoadFromStream immer nur beim "richtigen" Graphic-Typen und nur im LoadFormFile war eine Prüfung der Dateiendung drin. Leider war mal wieder einer der Entwickler dermaßen asozial und hat alles in der Implementation versteckt und bietet keinen direkten Zugriff auf FileFormats, bzw.
Delphi-Quellcode:
TheGraphicsClass := FileFormats.FindFormat(YourStrem); {if Assigned(TheGraphicsClass) then} YourFileExtension := GraphicExtension(TheGraphicsClass);
PS: ![]() |
AW: Welche Art von Grafik wurde gespeichert
Tatsächlich werden die CanLoadFromStream class functions der registrierten TGraphic-Abkömmlinge aufgerufen, wenn man TPicture.LoadFromStream verwendet.
|
AW: Welche Art von Grafik wurde gespeichert
Hätte man den nicht einfach den bisherigen Dateinamen samt Endung in der Tabelle mit wegspeichern können, dann hätte man das Problem doch gar nicht, oder denk ich da zu einfach?
|
AW: Welche Art von Grafik wurde gespeichert
Jo, hätte ich auch so gemacht.
|
AW: Welche Art von Grafik wurde gespeichert
Kann man machen, vorallem praktisch, wenn man die Bilder irgendwann mal wieder exportieren möchte.
Aber den Typ aus dem Dateninhalt zu bekommen hat noch einen anderen Vorteil. -> falsche Dateiendung Auch das TDBImage kann nun mit anderen Formaten gefüttert werden, anstatt wie früher nur Bitmap. (weil ja LoadFromStream aus'm Blob) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz