Delphi 压缩图片(BMP、JPG、PNG)


本文整理自网络,侵删。

 
function CompressImageFile(FileName: string;  Width, Height: integer; PressQuality:Integer= 90): Boolean;
   function GetNewSize(OldWidth, OldHeight: integer; NewWidth, NewHeight: integer; var RetWidth, RetHeight: integer):Boolean;
   var
       H:Boolean;
   begin
       Result := False;
       if (NewHeight < OldHeight) or (NewWidth < OldWidth) then
       begin
          H := NewHeight < OldHeight;
 
          if H then
          begin //按比例缩小,按高度来算高度的
             RetHeight := NewHeight;
             RetWidth := Round(OldWidth *  (NewHeight/OldHeight));
          end
          else
          begin //按比例缩小,按宽度来算宽度的
             RetWidth := NewWidth;
             RetHeight := Round(OldHeight * (NewWidth/OldWidth));
          end;
          Result:=True;
       end;
   end;
var
   bmp: TBitmap;
   jpg: TJpegImage;
   png: TPNGGraphic;
   i: Integer;
   sTemp: string;
begin
 
   Result := False;
   try
      bmp := TBitmap.Create;
      jpg := TJPEGImage.Create;
      png := TPNGGraphic.Create;
      if pos(UpperCase('.bmp'), UpperCase(filename)) <> 0 then   //bmp格式
      begin
         bmp.LoadFromFile(filename);
         jpg.Assign(bmp);
         jpg.CompressionQuality := PressQuality;
         jpg.Compress;
         if GetNewSize(bmp.Width,bmp.height,Width,Height,Width,Height) then
         begin
            bmp.height := Height;
            bmp.Width := Width;
            bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpg);
            jpg.Assign(bmp);
            sTemp := filename + '.lq';
            jpg.SaveToFile(sTemp);
            DeleteFile(filename);
            CopyFile(PChar(sTemp), PChar(filename), True);
            DeleteFile(sTemp);
            Result := True;
         end;
      end
      else if pos(UpperCase('.png'), UpperCase(filename)) <> 0 then //jpg其它格式
      begin
         jpg.LoadFromFile(filename);
         if GetNewSize(jpg.Width,jpg.height,Width,Height,Width,Height) then
         begin
            bmp.height := Height;
            bmp.Width := Width;
            bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpg);
            jpg.Assign(bmp);
            jpg.CompressionQuality := PressQuality;
            jpg.Compress;
            sTemp := filename + '.lq';
            jpg.SaveToFile(sTemp);
            DeleteFile(filename);
            CopyFile(PChar(sTemp), PChar(filename), True);
            DeleteFile(sTemp);
            Result := True;
         end;
      end
      else if pos(UpperCase('.png'), UpperCase(filename)) <> 0 then   //png格式
      begin
         png.LoadFromFile(filename);
         if GetNewSize(png.Width,png.height,Width,Height,Width,Height) then
         begin
            bmp.height := Height;
            bmp.Width := Width;
            bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, png);
            jpg.Assign(bmp);
            jpg.CompressionQuality := PressQuality;
            jpg.Compress;
            sTemp := filename + '.lq';
            jpg.SaveToFile(sTemp);
            DeleteFile(filename);
            CopyFile(PChar(sTemp), PChar(filename), True);
            DeleteFile(sTemp);
            Result := True;
         end;
      end;
   finally
      FreeAndNil(bmp);
      FreeAndNil(jpg);
      FreeAndNil(png);
   end;
end;
 
procedure TForm1.btn1Click(Sender: TObject);
begin
   CompressImageFile('d:\png\222.png', 200, 200);
end;

――――――――――――――――

原文链接:https://blog.csdn.net/lqena/article/details/78732255

相关阅读 >>

Delphi 路径有空格调用批处理

Delphi 获取某个页面所有的链接

Delphi 先加载原内容在写入增加新内容

Delphi 中英文字符怎么按固定长度截断

Delphi获取网卡mac地址的两种方法

Delphi获得系统当前时间日期和格式化时间

Delphi 检查ip地址合法性

Delphi 如何取得键盘每个键

Delphi 在firemonkey应用程序中使用torientationsensor获取设备倾斜和指南针航向

Delphi string转为olevariant

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...