Показать сообщение отдельно
  #2  
Старый 24.03.2022, 00:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну что сложного. Единственный параметр, который ты можешь менять - 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%).
Ответить с цитированием