我尝试在imgQInput(它是一个TImage)中加载图像,将其分配给TJpegImage,压缩它(压缩系数5)并在imgQOutput(另一个TImage)中显示它。但它不起作用。 imgQOutput中的图像与原始图像相同。它应该看起来非常像素化,因为压缩因子!然而,压缩的作品,因为当我将JPEG保存到磁盘时,它确实很小。无法压缩JPEG图像并在屏幕上显示
JPG:= TJPEGImage.Create;
TRY
JPG.CompressionQuality:= trkQuality.Position;
JPG.Assign(imgQInput.Picture.Graphic);
CompressJpeg(JPG);
imgQOutput.Picture.Assign(JPG); <--------- something wrong here. the shown image is not the compressed image but the original one
FINALLY
FreeAndNil(JPG);
END;
function CompressJpeg(OutJPG: TJPEGImage): Integer;
VAR tmpQStream: TMemoryStream;
begin
tmpQStream:= TMemoryStream.Create;
TRY
OutJPG.Compress;
OutJPG.SaveToStream(tmpQStream);
OutJPG.SaveToFile('c:\CompTest.jpg'); <--------------- this works
Result:= tmpQStream.Size;
FINALLY
FreeAndNil(tmpQStream);
END;
end;
TJpegImage保存位图DIB以及JPegData,即使压缩工作和保存到文件/流保存压缩的JPeg,将它分配给TImage.Picture使用DIB而不是原始图像,Vahid's答案是有效的,因为他已经从流中重新加载了JPeg,从而清除了DIB。 – Dampsquid 2012-02-26 20:59:12
感谢Dampsquid。还有另一种方式来做到这一点,而无需从流中重新加载它?像JpegNeeded或左右? – Ampere 2012-02-26 21:32:37
我从来没有找到一个,DIBNeeded只创建一个,如果没有一个,并且分配给新的TJPegImage也分配DIB,所以也不起作用。 – Dampsquid 2012-02-26 21:54:38