此代码编译时没有错误,但生成的图像为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'文件。
答案 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表示流指针从“开头”开始。