Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何减少JPG文件的大小?_Delphi_Size_Jpeg_Reduce - Fatal编程技术网

Delphi 如何减少JPG文件的大小?

Delphi 如何减少JPG文件的大小?,delphi,size,jpeg,reduce,Delphi,Size,Jpeg,Reduce,几天前我问了这个问题,得到了答案: 现在,当我将TPanel中的内容(1x形状、1x时间间隔、2x TLabel)保存为JPG文件时, JPG文件的大小从20kb(即图片的大小)增加到620kb 尺寸几乎相同。原始JPG文件320x320,新JPG图片361x440 那么,如何缩小这个尺寸呢 这是第一个问题的答案,来自@iPath,所以这就是如何创建新的JPG文件: procedure TForm1.SavePanelAsImage; var img: TBitmap; begin img

几天前我问了这个问题,得到了答案:

现在,当我将TPanel中的内容(1x形状、1x时间间隔、2x TLabel)保存为JPG文件时,
JPG文件的大小从20kb(即图片的大小)增加到620kb

尺寸几乎相同。原始JPG文件320x320,新JPG图片361x440

那么,如何缩小这个尺寸呢

这是第一个问题的答案,来自@iPath,所以这就是如何创建新的JPG文件:

procedure TForm1.SavePanelAsImage;
var
 img: TBitmap;
begin
 img := TBitmap.Create;
 try
  img.Width := fpPanel.Width;
  img.Height := fpPanel.Height;
  fpPanel.PaintTo(img.Canvas, 0, 0);
  img.SaveToFile(fpFileName);
 finally
  img.Free;
end;
end;

您保存的不是JPEG图像。您已保存Windows位图。没有任何压缩。它碰巧有
.jpg
扩展名,但这并不意味着文件本身就是JPEG

您需要使用
TJPEGImage
保存文件。使用属性控制压缩。一旦你有了位图中的图像,把它转换成JPEG格式

uses
  jpeg;

procedure TForm1.SavePanelAsImage;
var
  img: TBitmap;
  JpegImage: TJPEGImage;
begin
  img := TBitmap.Create;
  try
    img.Width := fpPanel.Width;
    img.Height := fpPanel.Height;
    fpPanel.PaintTo(img.Canvas, 0, 0);
    JpegImage := TJPEGImage.Create;
    try
      JpegImage.CompressionQuality := ...;//you decide the value
      JpegImage.Assign(img);
      JpegImage.SaveToFile(fpFileName);
    finally
      JpegImage.Free;
    end;
  finally
    img.Free;
  end;
end;

文件保存为位图,而不是JPEG格式

即使在“质量非常好”的情况下,JPEG也不会有那么大


但是,32位位图(不带RLE)将为-361*440*4(字节/像素)~640k

尝试使用内核批量图像大小调整工具一次性调整图像大小。

正在创建位图文件!在我回答中的注释部分,我提到必须使用TJPEGImage将位图转换为Jpeg。我的示例保存了一个位图,@David Heffernan澄清了这一点;)请注意,顺便说一句,JPEG是一种有损压缩算法,这意味着如果保存图像并再次加载,则无法返回完全相同的图像。因此,如果您多次编辑它,每次保存为JPEG,您的图像将遭受多代损失。
implementation
uses Jpeg;


procedure SaveBMPasJPG(bmp:TBitmap; const FileName:String;Quality:Integer=90);
var
  jpg:TJpegImage;
begin
   jpg:=TJpegImage.Create;
   try
     jpg.CompressionQuality := Quality;
     jpg.Assign(bmp);
     jpg.SaveToFile(FileName);
   finally
     jpg.Free;
   end;

end;