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;