2012-02-26 12 views
5

मैं imgQInput (जो एक टीआईमेज है) में एक छवि लोड करने का प्रयास करता हूं, इसे एक TJpegImage को असाइन करें, इसे संपीड़ित करें (संपीड़न कारक 5) और इसे imgQOutput (एक और TImage) में दिखाएं। लेकिन यह काम नहीं करता है। ImgQOutput में छवि मूल के समान ही है। यह संपीड़न कारक के कारण बहुत pixelated देखना चाहिए! संपीड़न हालांकि काम करता है, क्योंकि जब मैं जेपीईजी को डिस्क में सहेजता हूं तो यह वास्तव में छोटा होता है।जेपीईजी छवि को संपीड़ित नहीं कर सकता है और इसे स्क्रीन पर दिखाया जा सकता है

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; 
+2

TJpegImage दोनों बिटमैप डीआईबी के साथ-साथ जेपीगेडेटा रखता है, भले ही संपीड़न काम करता है और फ़ाइल/स्ट्रीम में सहेजने से संकुचित जेपीईजी बचाता है, इसे टीआईमेज में असाइन किया जाता है। चित्र आपको मूल छवि के साथ छोड़कर डीआईबी का उपयोग करता है, वाहिद उत्तर काम करता है क्योंकि उसने जेपीईजी को स्ट्रीम से वापस लोड किया है, इस प्रकार डीआईबी को साफ़ कर दिया है। – Dampsquid

+0

धन्यवाद Dampsquid। स्ट्रीम से इसे पुनः लोड किए बिना इसे करने का दूसरा तरीका है? JpegNeeded की तरह या तो? – Ampere

+0

मुझे कभी नहीं मिला, DIBNeeded केवल एक बनाता है अगर पहले से कोई नहीं है, और एक नए TJPegImage को असाइन करने से DIB भी असाइन किया जाता है ताकि यह काम न करे। – Dampsquid

उत्तर

6

आपने संपीड़ित जेपीजी का बिल्कुल उपयोग नहीं किया था। निम्नलिखित के रूप में

बदलें CompressJpeg: (! याद है, छवियों बड़ा हो सकता है)

function CompressJpeg(OutJPG: TJPEGImage): Integer; 
VAR tmpQStream: TMemoryStream; 
begin 
tmpQStream:= TMemoryStream.Create; 
TRY 
    OutJPG.Compress; 
    OutJPG.SaveToStream(tmpQStream); 
    OutJPG.SaveToFile('c:\CompTest.jpg'); // You can remove this line. 
    tmpQStream.Position := 0;    // 
    OutJPG.LoadFromStream(tmpQStream);  // Reload the jpeg stream to OutJPG 
    Result:= tmpQStream.Size; 
FINALLY 
    FreeAndNil(tmpQStream); 
END; 
end; 
+0

यह काम करता है। धन्यवाद। क्या आप इसे थोड़ा सा समझा सकते हैं? – Ampere

+0

आपका स्वागत है। जब आप TJpegImage इंस्टेंस को संकुचित/सहेजते हैं तो यह मूल बफर को प्रभावित नहीं करता है। तो आपको बफर को अपडेट करने के लिए नव निर्मित जेपीईजी स्ट्रीम के साथ 'आउटजेपीजी' को पुनः लोड करने की आवश्यकता है। –

+0

लेकिन जब मैं आउटजेपीजी को डिस्क पर सहेजता हूं, तो छवि संपीड़ित होती है। तो, कुछ बदल गया था। – Ampere

3

यहाँ आप के लिए एक प्रतिस्पर्धा जवाब है, कम डेटा बाजीगरी के साथ है

type 
    TJPEGExposed = class(TJPEGImage);  // unfortunately, local class declarations are not allowed 

procedure TForm1.FormClick(Sender: TObject); 
var 
    JPEGImage: TJPEGImage; 
const 
    jqCrappy = 1; 
begin 
    Image1.Picture.Bitmap.LoadFromFile(GetDeskWallpaper); 

    Image2.Picture.Graphic := TJPEGImage.Create; 
    JPEGImage := Image2.Picture.Graphic as TJPEGImage; // a reference 
    JPEGImage.Assign(Image1.Picture.Bitmap); 
    JPEGImage.CompressionQuality := jqCrappy; // intentionally 
    JPEGImage.Compress; 
    TJPEGExposed(JPEGImage).FreeBitmap; { confer: TBitmap.Dormant } 
end; 

TJPEGImage.FreeBitmap disposes अस्थिर डीआईबी के भीतर निहित TJPEG छवि उदाहरण। सचित्र मामले में यह TImage पुनर्भुगतान के जवाब में हाल ही में .Compress 'एड जेपीईजी को डीकोड करने का कारण बनता है।

+0

'फ्रीबिटमैप' भाग क्या करता है? (confer?) –

+0

@ लियोनार्डोहेरेरा, एक उत्तर में टिप्पणी जोड़ा। – OnTheFly

+0

समझ गया, धन्यवाद! –

संबंधित मुद्दे

 संबंधित मुद्दे