2015-07-07 3 views
5

एक तरह से TPngObject का आकार बदलने और कोई लाभ नहीं हुआ पारदर्शिता + अल्फा चैनल बनाए रखने के लिए के लिए देखने के बाद, मैं GDI +जीडीआई + का उपयोग कर अल्फा चैनलों के साथ पीएनजी छवि का आकार कैसे बदलें?

यहाँ मेरी कोड है उपयोग करने के लिए कोशिश कर रहा हूँ, और यह ठीक काम करने के लिए लगता है। यह एक पीएनजी स्केल डाउन/अप करेगा। अब तक XP पर परीक्षण किया गया:

uses GDIPAPI, GDIPOBJ, GDIPUTIL; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    encoderClsid: TGUID; 
    stat: TStatus; 
    img, img_out: TGPImage; 
begin 
    img := TGPImage.Create('in.png'); // 200 x 200 
    img_out := img.GetThumbnailImage(100, 100, nil, nil); 
    GetEncoderClsid('image/png', encoderClsid); 
    img_out.Save('out.png', encoderClsid); 
    img_out.free; 
    img.Free; 
end; 

मेरा प्रश्न: GetThumbnailImage ऐसा करने का सही तरीका इस्तेमाल कर रहा है? मुझे कोई अन्य विधि नहीं मिली।

उत्तर

7

मुझे नहीं लगता कि GetThumbnailImage विधि जाने का एक अच्छा तरीका है क्योंकि मुझे संदेह है कि आपको उच्च गुणवत्ता वाले पुन: चित्रित छवि मिल जाएगी। this article में आप छवि को पुन: सहेजने के तरीके को पा सकते हैं। वे इसके लिए DrawImage विधि का उपयोग कर रहे हैं, इसलिए मैं वही करूँगा। इससे पहले कि मैं उच्च गुणवत्ता वाले आउटपुट प्राप्त करने के लिए उच्च गुणवत्ता वाले ग्राफिक्स मोड भी सेट करूंगा। यहां एक उदाहरण दिया गया है:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Input: TGPImage; 
    Output: TGPBitmap; 
    Encoder: TGUID; 
    Graphics: TGPGraphics; 
begin 
    Input := TGPImage.Create('C:\InputImage.png'); 
    try 
    // create the output bitmap in desired size 
    Output := TGPBitmap.Create(100, 100, PixelFormat32bppARGB); 
    try 
     // create graphics object for output image 
     Graphics := TGPGraphics.Create(Output); 
     try 
     // set the composition mode to copy 
     Graphics.SetCompositingMode(CompositingModeSourceCopy); 
     // set high quality rendering modes 
     Graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
     Graphics.SetPixelOffsetMode(PixelOffsetModeHighQuality); 
     Graphics.SetSmoothingMode(SmoothingModeHighQuality); 
     // draw the input image on the output in modified size 
     Graphics.DrawImage(Input, 0, 0, Output.GetWidth, Output.GetHeight); 
     finally 
     Graphics.Free; 
     end; 
     // get encoder and encode the output image 
     if GetEncoderClsid('image/png', Encoder) <> -1 then 
     Output.Save('C:\OutputImage.png', Encoder) 
     else 
     raise Exception.Create('Failed to get encoder.'); 
    finally 
     Output.Free; 
    end; 
    finally 
    Input.Free; 
    end; 
end; 
+0

मैं समझने में असफल रहा कि पारदर्शिता/अल्फा यहां क्यों रखता है, लेकिन यह काम करता है :) धन्यवाद! – zig

+3

आपका स्वागत है! अल्फा चैनल को आउटपुट बिटमैप प्रारूप के कारण संरक्षित किया गया है (जिसे मुझे स्पष्ट रूप से निर्दिष्ट करना पड़ता है भले ही यह अस्पष्ट अधिभार के कारण डिफ़ॉल्ट हो)। यदि आप उदा। 'PixelFormat32bppRGB', आप अल्फा चैनल खो देंगे। और प्रतिपादन स्वयं पारदर्शिता (शुद्ध जीडीआई में भी) मानता है। – TLama

+0

धन्यवाद। बीटीडब्लू, GetThumbnailImage छवि को काफी अच्छी तरह से फिर से नमूना प्रतीत होता है। – zig

2

मुझे नहीं लगता कि GetThumbnailImage विधि का उपयोग सही दृष्टिकोण है। क्यूं कर?

GetThumbnailImage विधि का मुख्य उपयोग एक थंबनेल प्राप्त कर रहा है जिसे आप कुछ उच्च रिज़ॉल्यूशन छवि के पूर्वावलोकन के रूप में उपयोग कर सकते हैं।

इसलिए मुझे लगता है कि पीछे उपयोग किए जाने वाले एल्गोरिदम को यथासंभव तेज़ी से विकसित किया गया है, लेकिन शायद यह अंतिम परिणाम की गुणवत्ता के बारे में ज्यादा परवाह नहीं करता है। तो इस विधि का उपयोग करने से बहुत खराब गुणवत्ता वाली छवियों का आकार बदल सकता है।


अब तुम सच में डेल्फी का उपयोग कर तो आप निश्चित रूप से Graphics32 पुस्तकालय (http://graphics32.org/wiki/) की जाँच करनी चाहिए छवि हेरफेर में रुचि रखते हैं, तो।

यह डेल्फी 7 और ऊपर के सभी डेल्फी संस्करणों का समर्थन करता है। यह कई उन्नत छवि मैनिपुलेशन एल्गोरिदम प्रदान करता है। और सबसे अच्छा यह हार्डवेयर त्वरण का समर्थन करता है जिसका अर्थ है कि यह वास्तव में उन छवि कुशलताओं को बनाने के लिए आपके जीपीयू प्रसंस्करण शक्ति का उपयोग कर सकता है।

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