2013-11-21 62 views
-2

该代码编译时没有错误,但图像是用0字节生成的。有人能帮助我吗?压缩图像的过程(bmp到jpg)

这是为将图像转换的过程:

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; 

文件 'image.jpg的' 与0字节生成。

+3

尝试添加行stream.position:= 0;之间jpeg.SaveToStream(流)和ImageTo.LoadFromStream(流) – Jason

+0

WOWWWWW !!!!谢谢贾森!成功了! – user3015502

+0

“太本地化”关闭选项在哪里?那已被删除?由于标题和问题与实际问题无关,所以有人不太可能在未来发现这个问题有用。 – jpfollenius

回答

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。将“位置”属性设置为0将指示流指针从“开始”开始。