2011-03-21 11 views
5

डेल्फी 2006 का टीआईएमज पीएनजी का काफी समर्थन नहीं करता है। मेरे रूपों पर अल्फा पारदर्शिता वाली छवियां रखने के लिए मुझे उन्हें रन-टाइम पर लोड करना होगा। मैं उन्हें डिजाइन समय पर लोड कर सकता हूं लेकिन वे जीवित नहीं रहते हैं, मुझे लगता है क्योंकि पीएनजी डीएफएम फ़ाइल में सहेजे नहीं जाते हैं। मुझे यकीन है कि यह नवीनतम डेल्फी में सभी हंसी-डोरी है लेकिन मैं इस समय सही तरीके से अपग्रेड नहीं कर सकता।डेल्फी 2006: टीआईएमएजी को पीएनजी के रन-टाइम असाइनमेंट अल्फा पारदर्शिता खो देता है

वैसे भी, मैं के साथ रन-टाइम में उन्हें लोड किया गया था:

Image1.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ; 

PNGImageCollection घटक विभिन्न आकार के सभी मेरी PNG का (इन बनाया और डिजाइन समय में लोड किए गए हैं) रखती है, और मैं करने के लिए उन्हें आवंटित FormCreate घटना में संबंधित TImages।

यह ठीक काम करता है, जब तक कि मुझे कोई समस्या न हो, जहां मैं किसी भी रूप में इन छवियों में से किसी एक को फिर से उपयोग करने के बाद इन छवियों में से किसी एक का पुन: उपयोग करने का प्रयास कर रहा था। मैंने पाया कि टीपीिक्चर को आवंटित करने के कार्य ने इसे असाइन किए जाने के परिणामस्वरूप एक खाली छवि पर सेट कर दिया था। यह नियमित TPicture.ForceType में हो रहा था, जो AFAICT FGraphic के प्रकार की जांच करता है, और यदि यह वांछित प्रकार नहीं है, तो यह FGraphic को मुक्त करता है और अनुरोधित प्रकार का एक नया उदाहरण बनाता है।

ठीक है। तो चारों ओर खरोंच का एक सा के बाद, मुझे लगता है कि शायद मैं वास्तव में यह कर किया जाना चाहिए:

Image1.Picture.Bitmap.Assign (PngImageCollection1.Items [0].PNGImage) ; 

यह दांव, कि में असाइन छवि पीटना नहीं किया था, लेकिन छवि अब अर्द्ध साथ चलता अपारदर्शी, यानी के रूप में पारदर्शी बिट्स:

TImage when assigned with Image1.Picture.Bitmap.Assign

के बजाय:

TImage when assigned with Image1.Picture.Assign

कैसे ca n मुझे यह छवि अल्फा-पारदर्शी बिट्स को ठीक से प्रदर्शित करने के लिए मिलती है? (और पूरक प्रश्न: छवि 1 है। चित्र। बिटमैप। इसे करने का सही तरीका बताएं?)।

यहाँ थोड़ा और अधिक विस्तार में कोड है:

कोड जहाँ मैं समस्या "पुन: उपयोग" एक TImage था में, दृश्य था:
प्रपत्र पर बनाने के लिए:

LogoImage.Picture.Assign (PngImageCollection1.Items [0].PNGImage) ; 

(PNGIMage एक कंपनी लोगो है, लोगोइमेज 1 मुख्य रूप पर है)।

प्रिंट रिपोर्ट हेडर पर:

procedure PrintLogo (Report : TBaseReport) ; 

var 
    X1, Y1, LogoHeightMM : Double ; 

begin 
with Report do 
    begin 
    LogoHeightMM := CalcGraphicHeight (LogoWidthMM, MainForm.LogoImage.Picture.Graphic) ; 
    X1   := PageWidth - MarginRight - LogoWidthMM ; 
    Y1   := SectionBottom - LogoHeightMM ; 
    PrintBitmapRect (X1, Y1, X1 + LogoWidthMM, Y1 + LogoHeightMM, MainForm.LogoImage.Picture.Bitmap) ; 
    end ; 
end ; 

पहली बार नियमित लोगो मुद्रित करने के लिए कहा जाता है यह त्रुटि के बिना निष्पादित करता है, लेकिन LogoImage .Picture PrintBitmapRect करने के लिए कॉल के बाद मंजूरी दे दी छोड़ दी जाती है। अगली बार जब प्रिंट हेडर रूटीन कहा जाता है, तो CalcGraphicHeight को कॉल विफल रहता है क्योंकि छवि की चौड़ाई और ऊंचाई शून्य होती है।

चित्र बदलना। चित्र के लिए साइन इन करें। बिटमैप.एस्जिन ने हेडर प्रिंट रूटीन में आरटीई को ठीक किया है, लेकिन जब मैंने पीएनजी (जैसे उपरोक्त गियर) से आवंटित अन्य स्थिर छवियों को "फिक्स" ट्रांसप्लांट किया था तो मैंने खो दिया आभा चैनल

+1

मैं पक्ष में सवाल पर एक टैग का देने की सलाह देते हैं 'डेल्फी' का। ऐसे डेवलपर्स होना चाहिए जिन्होंने अतीत में पिछले संस्करणों का उपयोग किया हो लेकिन वर्तमान में उनके टैग नहीं देख रहे हैं .. –

+0

सबसे अच्छा परीक्षण केस में पुन: पेश करने का प्रयास करना सबसे अच्छा है, फिर वहां से काम करें। यदि आप उस छोटे टेस्ट केस को पोस्ट कर सकते हैं तो यह बहुत मदद करता है। –

उत्तर

5

आप अपने कोड का वास्तव में प्रासंगिक हिस्सा नहीं दिखा रहे हैं: आप उस छवि का पुन: उपयोग कैसे कर रहे हैं जिससे इसका कोई विशेष प्रकार हो।

जब आप एक TImage को एक TPngObject असाइन करते हैं, तो छवि के ग्राफ़िक में एक पीएनजी ऑब्जेक्ट होता है। केवल तभी जब आप विशेष रूप से बिटमैप का अनुरोध करते हैं, तो यह अपने ग्राफ़िक को बिटमैप प्रकार के रूप में मजबूर कर देगा। उदाहरण के लिए, इस,

Bmp.Assign(Image1.Picture.Bitmap); 

Image1 एक बिटमैप ग्राफिक है, के लिए बाध्य करेगा अगर इसकी ग्राफ़िक PNG वस्तु यह मुक्त हो जाएगा था। इस करते हैं,

Bmp.Assign(Image1.Picture.Graphic); 

एक बिटमैप ग्राफिक के लिए Image1 मजबूर नहीं होगा, png वस्तु काम बाहर ले जाने और वहाँ रहना होगा।

डेल्फी के बिटमैप्स (कम से कम हाल के संस्करणों तक), अल्फा-चैनल का समर्थन नहीं करते हैं, इसलिए आपको आंशिक रूप से पारदर्शी छवियों के लिए Image1.Picture.Bitmap.Assign(.. का उपयोग नहीं करना चाहिए।


Btw, के बजाय फिर से उपयोग कर छवि में ग्राफिक, तो आप शायद छवि स्रोत के रूप में अपने png छवि संग्रह में .. इस्तेमाल कर सकते हैं

+0

@Sertac ... कृपया प्रश्न के संपादन देखें। – rossmcm

+0

@rossmcm - यह 'PrintBitmapRect (..' लाइन है जो आपकी छवि को पीएनजी ऑब्जेक्ट को खोने का कारण बन रही है, क्योंकि आप विशेष रूप से बिटमैप का अनुरोध कर रहे हैं:' MainForm.LogoImage.Picture.Bitmap'। यह बिल्कुल पहले की तरह है उदाहरण के रूप में उदाहरण। अगर 'PrintBitmapRect' को बिटमैप की आवश्यकता है, तो एक अस्थायी बिटमैप बनाएं, इसका आकार सेट करें, उत्तर में दूसरे उदाहरण का उपयोग करके इसे असाइन करें, 'प्रिंटबिटमैप्रेक्ट' पर जाएं, फिर अस्थायी बिटमैप को मुक्त करें। –

+0

बहुत धन्यवाद। मुझे लगता है कि तीसरे पक्ष के पीएनजी समर्थन बहुत नाजुक और खंडित हैं। मुझे लगता है कि बुलेट को काटने और डेल्फी के वर्तमान संस्करण के लिए खोलने के लायक हो सकता है, इसलिए मैं पीएनजी समर्थन के इस मिशमाश का निपटान कर सकता हूं - क्या आप जानते हैं पीएनजी इकाइयों का उचित सूट एक ही स्थान से है? – rossmcm

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