AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi TJpegImage - aus Stream geladene Grafik komprimieren
Thema durchsuchen
Ansicht
Themen-Optionen

TJpegImage - aus Stream geladene Grafik komprimieren

Ein Thema von Matze · begonnen am 25. Apr 2008 · letzter Beitrag vom 26. Apr 2008
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 25. Apr 2008, 23:27
Hallo,

dieser Source speichert mir den Stream (TMemoryStream) korrekt auf der Festplatte:

Delphi-Quellcode:
JpegImage.LoadFromStream(AStream);
JpegImage.SaveToFile(SavePathName);
Sobald ich das Bild jedoch komprimieren möchte:

Delphi-Quellcode:
JpegImage.LoadFromStream(AStream);
JpegImage.CompressionQuality := 80;
JpegImage.Compress;
JpegImage.SaveToFile(SavePathName);
erhalte ich eine 0 KB große, natürlich kaputte, Jpg-Datei.

Woran liegt das?

Grüße, Matze
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 01:03
Hi,

versuche es mal so:
Delphi-Quellcode:
  
  JpegImage.LoadFromStream(AStream);
  JpegImage.DIBNeeded;
  JpegImage.CompressionQuality := 80;
  JpegImage.Compress;
  JpegImage.SaveToFile(SavePathName);
Noch eine andere Variante:
Delphi-Quellcode:
   
var
   bmp: TBitmap;
begin
  ...
  bmp:= TBitmap.Create;
  ...
  JpegImage.LoadFromStream(AStream);
  bmp.Assign(JpegImage);
  JpegImage.Assign(bmp);
  JpegImage.CompressionQuality := 80;
  JpegImage.Compress;
  JpegImage.SaveToFile(SavePathName);
   ...
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 08:30
Hallo bitsetter,

deine erste Variante funktioniert einwandfrei, vielen Dank!

Ich würde gerne verstehen, wieso ich DIBNeeded brauche. In der Hilfe steht dazu folgendes, doch daraus werde ich nicht schlau:

OH zu "DIBNeeded":
Setzen Sie DIBNeeded ein, wenn für die JPEG-Grafik eine Bitmap-Darstellung erforderlich ist. Rufen Sie diese Methode zur Optimierung direkt vor dem Zeichnen auf (nicht während des Zeichnens).

Im Stream befindet sich nämlich eine Grafik im JPG-Format.

Grüße, Matze
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#4

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 09:39
Die Lösung ist ganz einfach. LoadFromStream lädt dein Bild und liest den Header des JPEGs ein. Und erst wenn du es auf ein Bitmap zuweist oder DIBNeeded aufrufst wird das Bild dekodiert. Das LoadFromStream ist innerhalb von ein paar Millisekunden fertig wärend das DIBNeeded durchaus schon etwas länger dauern kann.

Bei deiner ersten Methode LoadFromStream und SaveToStream sollte das JPEG auch unverändert wieder auf die Platte gespeichert werden. Also ohne es neu komprimieren zu müssen, da das eigentlich immer mit einem Qualitätsverlust einher geht.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 09:48
Hallo Lossy eX

Zitat von Lossy eX:
Und erst wenn du es auf ein Bitmap zuweist oder DIBNeeded aufrufst wird das Bild dekodiert.
Hm und wenn ich das Bild versuche zu komprimieren ohne DIBNested zu nutzen bzw. ohne es einem Bitmap zuzuweisen, dann erzeugt Compress ein fehlerhaftes, leeres Bild? Das ist aber auch irgendwie komisch.
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 13:17
Zitat von Matze:
Hm und wenn ich das Bild versuche zu komprimieren ohne DIBNested zu nutzen bzw. ohne es einem Bitmap zuzuweisen, dann erzeugt Compress ein fehlerhaftes, leeres Bild? Das ist aber auch irgendwie komisch.
Für die Prozedur Compress wird das Feld FBitmap benötigt, welches mit DIBNested durch Aufruf der Funktion GetBitmap erzeugt wird. Wenn du nur das Bild von einem Stream lädst, dann ist FBitmap = nil.
Dummerweise wird in der Prozedur Compress die Kompression schon "fleißig" vorbereitet und dann erst geprüft ob FBitmap <> nil bzw. die Höhe und Breite > 0 ist. Würde das Feld FBitmap gleich am Anfang der Prozedur abgefragt, so würde auch kein leeres Bild erzeugt werden.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 13:59
Zitat von bitsetter:
Würde das Feld FBitmap gleich am Anfang der Prozedur abgefragt, so würde auch kein leeres Bild erzeugt werden.
Ah, da hat also jemand ein wenig rumgepfuscht.
Schön wäre es natürlich gewesen, wenn es abgefragt und ggf. DIBNested oder GetBitmap aufgrufen werden würde. Naja, dann muss man eben selbst dran denken, so tragisch ist das ja nicht.

Grüße, Matze
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#8

Re: TJpegImage - aus Stream geladene Grafik komprimieren

  Alt 26. Apr 2008, 17:53
Na ja. Nicht unbedingt. Also im Falle von TJPEGImage sicherlich nicht unsinnig. Aber mit JPEGs kann man auch verlustfreie Operationen durchführen. Also Rotieren oder in einem 16 Pixel Raster zuschneiden. Und der Witz dabei ist, dass man das Bild eben nicht neu kodieren muss. Entsprechend sind die Operationen schnell und verändern auch nicht ein einziges Bit der Pixel.

Mit dem TJPEGImage sind diese Operationen leider nicht möglich, da einige wichtige Strukturen nicht zugänglich sind die dafür aber leider unabdingbar sind. Obwohl die technisch dazu auch in der Lage ist. Entsprechend hast du aber schon recht. Eigentlich hätten sie es auch automatisiert aufrufen können.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 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