Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Bild in byte umwandeln und speichern / laden (https://www.delphipraxis.net/187099-bild-byte-umwandeln-und-speichern-laden.html)

CrashBack 28. Okt 2015 01:46


Bild in byte umwandeln und speichern / laden
 
Hallo liebe Delphi Praxis Gemeinde.

Ich brauch mal eure Hilfe.
Ich möchte ein Bild in einer Datenbank Speichern, da kam ich auf die Idee das Bild in byte Umzuwandeln und dann zu speichern und wenn ich es brauche es von da zu laden.


Nur wie muss ich vorgehen? Ich wäre für Hilfe sehr Dankbar.

Luckie 28. Okt 2015 02:14

AW: Bild in byte umwandeln und speichern / laden
 
Wie in Byte umwandeln? Eine Datei, welches Format auch immer, besteht immer aus Bytesa (1/0). Was anderes kennt der Computer nicht.

Nimm ein Blob-Feld und lege die Datei mit Hilfe eines Streams dort ab.

Dejan Vu 28. Okt 2015 06:37

AW: Bild in byte umwandeln und speichern / laden
 
Zitat:

Zitat von Luckie (Beitrag 1319885)
Eine Datei, ... besteht immer aus Bytesa (1/0). Was anderes kennt der Computer nicht.

Ich hoffe, der Computer kennt etwas anderes als Bytesa (1/0). Sagen wir: Bits. Oder Bytes.

delnu 28. Okt 2015 09:24

AW: Bild in byte umwandeln und speichern / laden
 
@Dejan Vu: Der Kommentar ist themenfremd, zumal das "a" neben dem "s" liegt und darum zum Abrutschen nicht viel gehört - unabhängig davon, daß natürlich immer sinnvoll ist, Beiträge möglichst vor dem Abschicken auf Fehler zu prüfen oder wenigstens danach Korrektur zu lesen.

Zum eigentlichen Thema:
Vor längerer Zeit hatte ich mich auch damit befaßt, Grafiken als Blobs zu speichern. Leider sind die letzten Ansätze von 2010 und ich müßte mich erst wieder einarbeiten, zumal ich sehr viele Zusatzkomponenten bzw. Units eingebastelt hatte, die ich erst zusammensuchen müßte.

Was mir aber noch in Erinnerung ist: Die Größe der einzelnen Grafiken ist nicht ohne Bedeutung. Am Einfachsten ist das Vorhaben bei Winzgrafiken gleicher Dateigröße, beispielsweise Cursoren, Glyphs und Icons.

Weil ich letztlich auch exotische Grafikformate eingebaut hatte, die wohl kaum jemand kennt, war entsprechend erforderlich auch passende Betrachter zu integrieren. Das war damals mit Delphi 5.

Leider weiß ich nicht, welche Grafikformate von heutigen Delphi-Versionen standardmäßig berücksichtigt werden.

Als Dateiformat hatte ich damals bewußt DBF gewählt und den Zugriff über TDBF gestaltet, statt die dumme "Database Engine" zu benutzen.

Aus einer meiner damaligen Kommentardateien kann ich jetzt erstmal diesen Passus schicken, weiß aber nicht, ob das so schon hilft:
Code:
VAR
 tmp      : TMemoryStream;
 BildDaten : String;

...
 BildDaten:=DBF1Bild.value;

 TMP:=TMemoryStream.Create;
 TMP.WriteBuffer(bilddaten[1],DBF1Bild.blobsize);
 Tmp.Position :=0;
 TRY
  DBImage1.Picture.BitMap.LoadFromStream(tmp);
 EXCEPT
  ...
 END;

 tmp.free;
Nächste Woche (früher werde ich nicht dazu kommen) versuche ich mal, meinen damaligen Ansatz weitgehend auf Standardkomponenten/Dateiformate zu reduzieren und dann hier hochladen - es sei denn, jemand anderes hat bereits ein einfaches Beispiel parat und schafft es schneller.

Perlsau 28. Okt 2015 09:26

AW: Bild in byte umwandeln und speichern / laden
 
Zitat:

Zitat von CrashBack (Beitrag 1319884)
Ich möchte ein Bild in einer Datenbank Speichern, da kam ich auf die Idee das Bild in byte Umzuwandeln und dann zu speichern und wenn ich es brauche es von da zu laden.

Hier werden Sie geholfen.

Sir Rufo 28. Okt 2015 11:40

AW: Bild in byte umwandeln und speichern / laden
 
Ich würde mir das Leben gar nicht so schwer machen und das mit einer Zeile Code abkaspern:
Delphi-Quellcode:
var
  ABitmap: TBitmap;
  AFieldName: string;
  SomeDataSet: TDataSet;
 
SomeDataSet.FieldByName( AFieldName ).Assign( ABitmap );

Perlsau 28. Okt 2015 16:43

AW: Bild in byte umwandeln und speichern / laden
 
Das ist selbstverständlich weitaus eleganter, wenn's nur um Bitmaps geht. Mit meinen Methode kannst du dagegen alle "Bits und Bytes" in einem Blobfeld speichern, egal ob sich's dabei um eine Bild-, PDF-, Zip- oder Sonstwas-Datei handelt.

delnu 28. Okt 2015 22:43

AW: Bild in byte umwandeln und speichern / laden
 
Liste der Anhänge anzeigen (Anzahl: 2)
Auch wenn mittlerweile vielleicht einfache Methoden genannt wurden - ich habe das jetzt nicht ausprobiert - möchte ich dem Themenstarter doch mal ein Komplettbeispiel geben. Das ist zwar nicht das komplexe Teil, das ich weiter vorne erwähnt hatte, aber dafür konnte ich es relativ schnell aufs Wesentliche minimieren.

Außer TDBF wird keine Fremdkomponente benötigt. Weil es davon verschiedene Versionen gibt, habe ich sicherheitshalber die angefügt, mit der ich das unter Delphi 5 erstellt habe.

Die 2 weiteren Units:
"bilder" erzeugt eine leere DBF-Datei, falls noch keine existiert.
"FileTools" dient dazu, alle 3 möglichen Datumswerte (erstellt, geändert und letzter Zugriff) identisch zu setzen. Das ist sinnvoll, wenn die in der Datenbank gespeicherten Grafiken wieder mit dem Originaldatum extrahiert werden sollen. Weil diese Unit unabhängig vom Programm ist, kann sie auch anderswo eingesetzt werden. Woher die Quellen dazu stammen, weiß ich nicht mehr. Aber es hatte damit zu tun, daß bei manchen Digitalfotos das Datum der Dateien vom Datum in den EXIF-Angaben abweicht.

Benötigte Unterverzeichnisse werden automatisch angelegt, falls nicht vorhanden. Das läßt sich im Quelltext anpassen.

Das Beispiel ist speziell auf Glyphs mit 2 enthaltenen Grafiken zugeschnitten. Beim Speichern (Pfad mit passenden Grafiken wählen, in der FileListBox anklicken) werden alle relevanten Daten (Größe, Erstellungsdatum etc.) übernommen.

Die in der DBF-Datei enthaltenen Bilder können direkt wieder als Grafiken abgespeichert werden, aber auch als RC-Datei. Außerdem können Textlisten mit den relevanten Daten der in der Datenbank enthaltenen Grafiken erstellt werden.

Zum Testen sind 2 kleine Datenbanken enthalten.

Ich hoffe, das ist alles weitgehend selbst erklärend und der Themenstarter kann was damit anfangen.

himitsu 29. Okt 2015 10:04

AW: Bild in byte umwandeln und speichern / laden
 
Zitat:

Zitat von delnu (Beitrag 1319917)
Aus einer meiner damaligen Kommentardateien kann ich jetzt erstmal diesen Passus schicken, weiß aber nicht, ob das so schon hilft:
Code:
VAR
 tmp      : TMemoryStream;
 BildDaten : String;

...
 BildDaten:=DBF1Bild.value;

 TMP:=TMemoryStream.Create;
 TMP.WriteBuffer(bilddaten[1],DBF1Bild.blobsize);
 Tmp.Position :=0;
 TRY
  DBImage1.Picture.BitMap.LoadFromStream(tmp);
 EXCEPT
  ...
 END;
 tmp.free;

Ein TDBImage kann direkt an die DataSource gehängt werden und holt sich das BitMap von alleine da raus. :gruebel:

Wenn man es unbedingt alleine machen will, dann TImage, wobei man es dann auch mit anderen Grafikformaten füttern könnte.


Bild in "ein" Byte umwandeln?
Arbeitest du für den CIA (TV-Version)? Die holen auch ein detailreiches Bild aus einem Pixel raus.

delnu 29. Okt 2015 10:24

AW: Bild in byte umwandeln und speichern / laden
 
Wo schrieb denn der Themenstarter, daß es ein Byte sein sollte ? Ich finde solche themenfremden Lästerkommentare immer störend, weil sie keinem nutzen ! Natürlich meinte er Bytes.

Was das Zitat meiner kurzen Sequenz betrifft, so sollte das nur eine erste Hilfe sein. Aber glaube mir, es kann durchaus Gründe haben, auf unterschiedliche Weise auf Images zuzugreifen. Mir geht es grundsätzlich drum, damit auch mehr machen zu können, als sie bloß zu speichern und zu laden.

Dir steht frei - und anderen natürlich auch - das von mir zur Verfügung gestellte Beispiel nach eigenen Wünschen umzugestalten.:lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.

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