![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Всем привет нужно помощь. Имеется фотографии более размерным весом более 1мб. Мне нужно ее подгрузить в Image1 и пере сохранить уже в сжатом по весу, разрешение и холст не трогаем, только исключительно вес, по условию состояние точнее не более 200 кб.  
		
	
		
		
		
		
		
		
			Вообщем нашел то что хотел это самое идеальное что мог найти. Код: 
	procedure TForm1.Button1Click(Sender: TObject);
const FileName = 'e:\Безымянный.jpg';
      FileNameOut = 'e:\БезымянныйOut.jpg';
var JpegIn: TJpegImage;
    Bitmap: TBitmap;
    MS: TMemoryStream;
function GetFileSize(PFileName: String): Int64;
var FS: TFileStream;
begin
  FS:=TFileStream.Create(PFileName,fmOpenRead);
  Result:=FS.Size;
  FS.Free;
end;
begin
  {загрузили jpg из файла}
  Label1.Caption:=Format('Размер исходного файла - %d',[GetFileSize(FileName)]);
  JpegIn:=TJpegImage.Create;
  JpegIn.LoadFromFile(FileName);
  {сконвертировали в bmp}
  Bitmap:=TBitmap.Create;
  Bitmap.Assign(JpegIn);
  {компрессия}
  JpegIn.Assign(Bitmap);
  Bitmap.Free;
  JpegIn.CompressionQuality:=50;
  JpegIn.Compress;
  {посмотрели размер в стреам}
  MS:=TMemoryStream.Create;
  JpegIn.SaveToStream(MS);
  Label3.Caption:=Format('Размер в стреам - %d',[MS.Size]);
  MS.Free;
  {записали в файл}
  JpegIn.SaveToFile(FileNameOut);
  Label2.Caption:=Format('Размер выходного файла - %d',[GetFileSize(FileNameOut)]);
  JpegIn.Free;Последний раз редактировалось lmikle, 23.03.2022 в 22:19.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну что сложного. Единственный параметр, который ты можешь менять - 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; | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
alexdudchenko2022 (24.03.2022)
  | ||
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Чудеса случаются! Спасибо человеческое. Единственная ошибка в функции поторопился видимо:  
		
	
		
		
		
		
		
	
		
		
	
	
	begin Bmp : TBitmap.Creare; А так всё классно!  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Это не ошибка, это опечатка. Писал тут, не проверял, вот и пропустил. Но по контексту понятно, что там именно Create. 
		
	
		
		
		
		
		
	
		
		
	
	
	Пожалуйста. Хотя такой простой код мог бы и сам догадаться. Если оставляем размер картинки тот же, то можно играться только со степенью сжатия...  | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Я люблю программирование просто не каждому дано всё знать, я умею всё правильно расставлять делать я сделаю но мне очень тяжело дается логика хоть и стараюсь в этом разбираться. Особенно с циклами всегда проблемы! Греёбанная логика!!! 
		
	
		
		
		
		
		
	
		
		
	
	
	 |