我嘗試在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