压缩图像的程序(bmp到jpg)

时间:2013-11-21 01:12:58

标签: image delphi compression delphi-7 procedure

此代码编译时没有错误,但生成的图像为0字节。有人能帮助我吗?

这是转换图片的过程:

procedure CompressImage(ImageFrom: TBitmap; ImageTo: TJPEGImage; Quality: integer);
var
  bmp: TBitmap;
  jpeg: TJPEGImage;
  stream: TMemoryStream;
begin
  bmp:=TBitmap.Create;
  jpeg:=TJPEGImage.Create;
  stream:=TMemoryStream.Create;
  try
    bmp.Assign(ImageFrom);
    jpeg.Assign(bmp);
    jpeg.PixelFormat:=jf24bit; // or jf8bit
    jpeg.CompressionQuality:=Quality;
    jpeg.ProgressiveDisplay:=False;
    jpeg.ProgressiveEncoding:=False;

    jpeg.Compress;
    jpeg.SaveToStream(stream);
    ImageTo.LoadFromStream(stream);
  finally
    bmp.Free;
    jpeg.Free;
    stream.Free;
  end;
end;

这就是我所说的:

procedure TForm1.FormCreate(Sender: TObject);
var
  imageBMP: TBitmap;
  imageJPG: TJPEGImage;
begin
  imageBMP:=TBitmap.Create;
  imageJPG:=TJPEGImage.Create;
  imageBMP.LoadFromFile('image.bmp');
  CompressImage(imageBMP, imageJPG, 50);
  imageJPG.SaveToFile('image.jpg');
  imageBMP.Free;
  imageJPG.Free;
end;

使用0个字节生成'image.jpg'文件。

1 个答案:

答案 0 :(得分:2)

在您的CompressImage程序中,您应该添加以下行:

stream.Position := 0;

之间:

jpeg.SaveToStream(stream);
ImageTo.LoadFromStream(stream);

如下:

jpeg.SaveToStream(stream);
stream.Position := 0;
ImageTo.LoadFromStream(stream);

这是因为当您将jpeg保存到流时,流指针的当前“位置”或位置是在jpeg数据的末尾。因此,当您调用ImageTo.LoadFromStream时,它会在您将jpeg保存到之后从流中的点开始读取流。将Position属性设置为0表示流指针从“开头”开始。