Ну что сложного. Единственный параметр, который ты можешь менять - CompressionQuality. Тогда как-то так:
Код:
const
szBytes = 1;
szKbytes = 1024;
szMbytes = 1024 * szKbytes;
function CompressToJpeg(jpgIn : TJPEGImage; szLimit : Integer) : TJPEGImage;
var
I : Integer;
Bmp : TBitmap;
memStream : TMemoryStream;
sz : Integer;
begin
Bmp : TBitmap.Creare;
Bmp.Assign(jpgIn);
Result := TJPEGImage.Create;
I := 100;
While I >=10 Do
Begin
Result.Assign(Bmp);
Result.CompressionQuality := I;
Result.Compress;
memStream := TMemoryStream.Create;
Result.SaveToStream(memStream);
sz := memStream.Size;
memStream.Free;
If sz <= szLimit Then Break;
I := I - 10;
End;
Bmp.Free;
end;
Использование:
Код:
var
jpg, out : TJPEGImage;
begin
jpg := TJPEGImage.Create;
jpg.LoadFromFile('filename.jpg');
out := CompressToJpeg(jpg,200*szKbytes);
out.SaveToFile('newfilename.jpg');
out.Free;
jpg.Free;
end;
Т.е. код попытается сжать файл что бы уложиться в предел 200к, если не получится, то вернет максимально сжатый вариант (10%).