Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fotos in einer DB komprimieren (https://www.delphipraxis.net/78050-fotos-einer-db-komprimieren.html)

AndreT 28. Sep 2006 11:34

Datenbank: MS SQL2003 • Zugriff über: ADO

Fotos in einer DB komprimieren
 
Hallo zusammen,

ich habe rund 2500 Fotos mit je~700kb auf einer Datenbank (MS SQL2003 Server: Feldtyp:Image) gespeichert.

Ich würde nun gerne die Fotos alle ähnlich dem Jpeg Prinzip komprimieren, sprich Größe beibehalten, aber Qualität verringern.

Ist das überhaupt möglich?
Weiß auch jemand wie?

Danke

Gruß Andre
:dp:

mkinzler 28. Sep 2006 11:47

Re: Fotos in einer DB komprimieren
 
Warum wandelst du sie nicht in jpeg, bevor du sie in die Datenbank schreibst?

AndreT 28. Sep 2006 12:03

Re: Fotos in einer DB komprimieren
 
Sie sind schon in der DB drin. Gesammelt von anderen über Jahre und ich bin nun das "Opfer" was die Gesamtgröße minimieren soll. :shock:

mkinzler 28. Sep 2006 12:09

Re: Fotos in einer DB komprimieren
 
Da gibt es noch nie Möglichkeit:
-Auslesen
-Umwandeln
-Zurückschreiben

chaosben 28. Sep 2006 12:28

Re: Fotos in einer DB komprimieren
 
... und falls nur per Delphi zugegriffen wird, kannst du es ziemlich einfach per TCompressionStream komprimieren. (Ja, das ist kein jpeg ... aber es ist verlustfrei komprimiert [was ja an sich nichts schlechtes ist])

AndreT 29. Sep 2006 05:43

Re: Fotos in einer DB komprimieren
 
Zitat:

Zitat von mkinzler
Da gibt es noch nie Möglichkeit:
-Auslesen
-Umwandeln
-Zurückschreiben

genau so hatte ich es vor



Zitat:

Zitat von chaosben
Da gibt es noch nie Möglichkeit:
... und falls nur per Delphi zugegriffen wird, kannst du es ziemlich einfach per TCompressionStream komprimieren. (Ja, das ist kein jpeg ... aber es ist verlustfrei komprimiert [was ja an sich nichts schlechtes ist])

und das ist das, wo mir bisher noch das Wissen zu fehlt ;)

chaosben 29. Sep 2006 06:35

Re: Fotos in einer DB komprimieren
 
Also der erste Schritt ist, das du die Bilder im Delphi als Stream verfügbar hast. Das machst du am besten mit den dir bekannten DB-Komponenten.
Danach brauchst du nur noch den Bild-Stream in einen TCompressionStream schreiben und dann den komprimierten Stream zurückschreiben.

alzaimar 29. Sep 2006 07:01

Re: Fotos in einer DB komprimieren
 
So eine verlustfreie Kompression (mit TCompressionStream) bringt aber nicht viel, denn die Bilder sind ja quasi verschlüsselt in der DB. Sie lassen sich mit einem normalen Programm nicht ohne Weiteres anzeigen.

Es gibt bei Delphi eine JPEG-Komponente, bzw. eine JPEG Unit, die Du einfach einbinden kannst. Dann gehst Du Record für Record durch deine Tabelle und wandelst eben Bild für Bild um.

Probiere es zunächst mit einem Bild auf der Festplatte. Ich würde das jetzt so machen:
Delphi-Quellcode:
MyBitmap.LoadFromFile('MyPic.BMP');
MyJpeg.Canvas.Draw (0,0, MyBitmap);
MyJPeg.SaveToFile ('MyPic.JPG');
Das klappt natürlich so nicht 1:1, aber im Prinzip lädst Du die Bitmap und zeichnes dieses Bild auf die Leinwand ('Canvas') des Jpeg-Objektes. Hinterher speicherst Du das wieder ab.

Anschließend liest du die Datei nicht per 'LoadFromFile' ein, sondern erstellst einen FileStream und lädst das Bild per 'LoadFromStream'.
Dann machst Du das Gleiche beim Speichern.

Und zum Schluss kommt der Stream nicht aus einer Datei, sondern von dem Blob-Feld ('TBlobField') der DB.

chaosben 29. Sep 2006 07:07

Re: Fotos in einer DB komprimieren
 
Zitat:

Zitat von alzaimar
So eine verlustfreie Kompression (mit TCompressionStream) bringt aber nicht viel, denn die Bilder sind ja quasi verschlüsselt in der DB. Sie lassen sich mit einem normalen Programm nicht ohne Weiteres anzeigen.

Zitat:

Zitat von chaosben
... und falls nur per Delphi zugegriffen wird, kannst du es ziemlich einfach per TCompressionStream komprimieren.

;)

AndreT 29. Sep 2006 08:32

Re: Fotos in einer DB komprimieren
 
Ihr verwirrt mich :?: :coder2:

von wo nach wo umwandeln.

Wenn ich das Bild einfach via

DBImage1 -> über Datasource zeigt es das Bild des Aktuellen Datensatzes an.

DBImage1.Picture.SaveToFile('d:\test.jpg');

habe ich ein Jpg mit 799kb.

Das soll kleiner werden und wieder zurück in die DB.


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