function CompressImageFile(
FileName, sTemp: 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 : TPNGImage;
begin
Result := False;
try
bmp := TBitmap.Create;
jpg := TJpegImage.Create;
png := TPNGImage.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);
jpg.SaveToFile(sTemp);
CopyFile(PChar(sTemp), PChar(FileName), True);
Result := True;
end;
end
else if pos(UpperCase('.jpg'), 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;
jpg.SaveToFile(sTemp);
CopyFile(PChar(sTemp), PChar(FileName), True);
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;
jpg.SaveToFile(sTemp);
CopyFile(PChar(sTemp), PChar(FileName), True);
Result := True;
end;
end;
finally
FreeAndNil(bmp);
FreeAndNil(jpg);
FreeAndNil(png);
end;
end;