![]() |
AW: JPEG CompressionQuality ermitteln
CompressionQuality <> Kompressionsrate
|
AW: JPEG CompressionQuality ermitteln
Zitat:
Und ist Zitat:
Delphi-Quellcode:
?
CompressionQuality
Zitat:
Zitat:
Delphi-Quellcode:
und damit die Dateigröße?
1
|
AW: JPEG CompressionQuality ermitteln
Zitat:
Mich interessiert nicht die Kompressionsrate der Datei(größe). |
AW: JPEG CompressionQuality ermitteln
würdest du mir bitte deine "CompressionQuality" definieren?
Für mich bestimmt sich nunmal die "CompressionQuality" aus dem relativen Größenerhältnis von max. unkomprimierten Bilddaten und der Größe der komprimierten Bilddaten. Wenn du Richtung Bildqualität bzw. Informationsverlust denkst, dann entscheidet da mehr die Kompressionssoftware und deren Algos&Vorfilter. Ein AdobePhotoshop kann Bilder ohne groß auffälligen & fürs menschliche Auge sichtbaren Qualitätsverlust viel "kleiner" packen. Wenn man ein 1GB Bild mit Delphi und Photoshop mit welchem "Kompressions-Wert" auch immer auf eine vergleichbare Dateigröße von 100MB also "1:10" komprimiert, wird warum auch immer die optische/gefühlte Bildqualität im durch Photoshop erzeugtem Bild höher sein... das rückwärts ohne org. Daten aus der Jpeg Datei zu bestimmen, also die bessere "CompressionQuality" im Sinne resultierend besserer Bildqualität zu ermitteln ist aus meiner Sicht nicht möglich. Nach meiner Methode des "relativen Größenvergleichs" wären beide Dateien gleich gut komprimiert und hätten für meine Software die selbe "CompressionQuality". |
AW: JPEG CompressionQuality ermitteln
CompressionQuality besagt, wie verlustbehaftet die Komprimierung ist. Bei 100% wird ohne Verlust komprimiert, bei kleineren Werten steigt der Verlust, d. h. die Bildqualität nimmt ab oder anders ausgedrückt: Das dekomprimierte Bild stimmt nicht mit dem Bild vor der Komprimierung überein. (Auch wenn die Bilder für das menschliche Auge gleich aussehen.)
![]() |
AW: JPEG CompressionQuality ermitteln
Zitat:
CompressionQuality ist nicht irgend ein Wert, sondern gemeint ist der von
Delphi-Quellcode:
, was dem geneigten Leser aber klar wird. Und da ich das Thema nicht erstellt habe, kann ich dessen Titel nicht beeinflussen.
Vcl.Imaging.jpeg.TJPEGImage.CompressionQuality
[EDIT]Bedeutet 100 wirklich, dass es ohne Verlust komprimiert wird? Ich denke, dass zumindest die JPEG-Version von Delphi immer verlustbehaftet ist. Ich probiere das zur Not auch aus.[/EDIT] Zitat:
Ab jetzt befasse ich mich damit, wie man das ganze noch mit GDI+ realisiert. Damit tue ich mich im Moment noch schwer, weil es im Internet nur extrem wenige Quellen zu Delphi und GDI+ gibt... |
AW: JPEG CompressionQuality ermitteln
Zitat:
Mithilfe der ersten Unit wird ein hilfreicher Wrapper (Klassen basiert) über die flachen GDI+-Funktionen gestülpt. Alle Methoden sind protected oder public, so dass man auch selber den Wrapper erweitern und mit hilfreichen Ableitungen arbeiten kann. Er ähnelt der Klassen basierten C++ API und von daher ist die MSDN ein guter Anlaufpunkt für Informationen. Auch als Delpi-Programmierer sollte man andere native Sprachen zumindest lesen können. Der C++-Beispielcode ist in der Regel gut zu verstehen. ![]() |
AW: JPEG CompressionQuality ermitteln
So wie mir bekannt ist kannst du diese nur zuweisen..
Ich habe meinen eigenen Wrapper..
Delphi-Quellcode:
QualityModeInvalid = -1;
QualityModeDefault = 0; QualityModeLow = 1; // Best performance QualityModeHigh = 2; // Best rendering Quality
Delphi-Quellcode:
so könnte das aussehen.
function GDIP_SaveImageToFile(filename: WideString; image: Cardinal; Quality: Integer
): GPSTATUS; stdcall; var rSplit: TSplitStrArray; encoderCLSID: TGUID; ext: string; IntI: Integer; format: string; EncoderParameters: PEncoderParameters; SaveQuality: Integer; listSize: UINT; begin ext := ExtractFileExt(filename); rSplit := Split(IMAGETYPES, ';'); for IntI := 0 to High(rSplit) do begin if rSplit[IntI] = ext then begin case IntI of 0: format := 'image/jpeg'; 1: format := 'image/png'; 2: format := 'image/bmp'; 3: format := 'image/gif'; 4: format := 'image/tiff'; 5: format := 'image/x-icon'; 6: format := 'image/x-emf'; 7: format := 'image/x-wmf'; else begin result := UnknownImageFormat; exit; end; end; break; end; end; SkinEngine.GetEncoderClsid(format, encoderCLSID); GdipGetEncoderParameterListSize(Image, @encoderCLSID, listSize); getmem(EncoderParameters, listSize); GdipGetEncoderParameterList(Image, @encoderClsid, listSize, EncoderParameters); SaveQuality := max(min(Quality, 100), 0); if (SaveQuality = 0) then SaveQuality := 100; EncoderParameters.Count := 1; EncoderParameters.Parameter[0].Guid := EncoderQuality; EncoderParameters.Parameter[0].NumberOfValues := 1; EncoderParameters.Parameter[0].Type_ := 4; EncoderParameters.Parameter[0].Value := @SaveQuality; Result := GdipSaveImageToFile(image, PWideChar(filename), @encoderCLSID, EncoderParameters); freemem(EncoderParameters, listSize); end; gruss |
AW: JPEG CompressionQuality ermitteln
Zitat:
Zitat:
![]() Ich stufe mich selbst aber als Laien - also nix Delpi-Programmierer - ein und versuche trotzdem halbwegs zu verstehen, was ich tue. Und da stolpere ich über so Sachen wie ISTREAM & Co. die scheinbar so gar nichts mit dem mir bekannnten
Delphi-Quellcode:
gemeinsam haben. Und ich sehe auch am übersetzten Code von EWeiss, dass es offenbar doch nicht einfacher geht, wie ich es erhofft hatte. Mit GDI+ werden es scheinbar zwangsläufig mehr als die 20 Zeilen...
T(Memory)Stream
P.S. Gibt es eine Funktion, mit der man TStatus in String übersetzen lassen kann? Ich kann das auch selbst. Aber wenn es das gibt, muss ich mir nicht die Arbeit machen. |
AW: JPEG CompressionQuality ermitteln
Zitat:
Beim Result musste sehen wie du es brauchst. Komprimierte Größe im Verhältnis zu unkomprimierte Größe oder andersrum. Ggf. hauste da noch ne * 100 dazu. Wie du magst.
Delphi-Quellcode:
function GetCompressRatio(const AJpegFilename: string): Double;
var Status: Winapi.GDIPAPI.TStatus; Image: Winapi.GDIPOBJ.TGPImage; OriginalStream, CompressStream: System.Classes.TMemoryStream; OriginalStreamAdapter, CompressStreamAdapter: Winapi.ActiveX.IStream; ImageFormat, EncoderCLSID: TGUID; EncoderParams: Winapi.GDIPAPI.TEncoderParameters; SaveQuality: Vcl.Imaging.jpeg.TJPEGQualityRange; // Integer geht natürlich auch! begin Result := 0; OriginalStream := TMemoryStream.Create; CompressStream := TMemoryStream.Create; // mit soOwned räumt der TStreamAdapter den TMemoryStream auf OriginalStreamAdapter := TStreamAdapter.Create(OriginalStream, soOwned); CompressStreamAdapter := TStreamAdapter.Create(CompressStream, soOwned); Image := Winapi.GDIPOBJ.TGPImage.Create(AJpegFilename); try if Assigned(Image) and (Image.GetWidth > 0) and (Image.GetHeight > 0) then begin Status := Image.GetRawFormat(ImageFormat); if (Status = TStatus.Ok) and (ImageFormat = ImageFormatJPEG) then begin if Winapi.GDIPUTIL.GetEncoderClsid('image/jpeg', EncoderCLSID) > -1 then begin // Bild OHNE Komprimierung im Stream speichern Status := Image.Save(OriginalStreamAdapter, EncoderCLSID); OutputDebugString(PWideChar(Winapi.GDIPUTIL.GetStatus(Status))); SaveQuality := 50; // oder was du magst für die Kompressionsrate FillChar(EncoderParams, SizeOf(EncoderParams), 0); EncoderParams.Count := 1; EncoderParams.Parameter[0].Guid := EncoderQuality; EncoderParams.Parameter[0].NumberOfValues := 1; EncoderParams.Parameter[0].Type_ := EncoderParameterValueTypeLong; EncoderParams.Parameter[0].Value := @SaveQuality; // Bild MIT Komprimierung im Stream speichern Status := Image.Save(CompressStreamAdapter, EncoderCLSID, @EncoderParams); OutputDebugString(PWideChar(Winapi.GDIPUTIL.GetStatus(Status))); Result := CompressStream.Size / OriginalStream.Size; end; end else OutputDebugString(PWideChar(Winapi.GDIPUTIL.GetStatus(Status))); end; finally Image.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 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