2010-04-08 13 views
7

मुझे दो 16x16 आरजीबी/ए। आईसीओ आइकन फाइलें मिली हैं, प्रत्येक एक अलग System.Drawing.Icon ऑब्जेक्ट में लोड की गई है।दो आइकनों को एक साथ कैसे मिलाएं? (दूसरे के शीर्ष पर ओवरले एक आइकन)

आप एक नया Icon ऑब्जेक्ट कैसे बनायेंगे जिसमें दो आइकनों का विलय होता है (एक दूसरे के ऊपर एक ओवरलैड)?


संपादित:
मैं शायद बहुत स्पष्ट है, मैं एक दूसरे में दो छवियों के मिश्रण करने के लिए नहीं करना चाहती नहीं था, मैं एक और एक के ऊपर एक आइकन ओवरले करना चाहते हैं।

मुझे यह जोड़ना चाहिए कि आइकन में पहले से ही पारदर्शी भाग हैं और मुझे दोनों आइकनों को दृश्यमान बनाने के लिए किसी भी पारदर्शी "मिश्रण" की आवश्यकता नहीं है। मुझे एक और आइकन के शीर्ष पर एक आइकन के गैर-पारदर्शी पिक्सल को ओवरले करना है। पारदर्शी पिक्सल को पृष्ठभूमि आइकन को दिखाए जाने चाहिए।

उदाहरण के लिए, स्टैक ओवरफ्लो आइकन देखें। इसमें कुछ क्षेत्र हैं जो भूरे और नारंगी हैं, और कुछ क्षेत्रों जो पूरी तरह से पारदर्शी हैं। कल्पना करें कि आप फ़ायरफ़ॉक्स आइकन के शीर्ष पर SO आइकन ओवरले करना चाहते हैं। आप पूर्ण रंग में SO आइकन के ग्रे और संतरे देखेंगे, और जहां SO आइकन पारदर्शी है, आप फ़ायरफ़ॉक्स आइकन के उन हिस्सों को देखेंगे।

+0

क्या आप बस परिणाम प्रदर्शित करना चाहते हैं, या वास्तव में आउटपुट के रूप में एक और आइकन है? – leppie

+0

वैसे अंत में हाँ मैं परिणाम प्रदर्शित करना चाहता हूं। लेकिन मेरे पास पहले से ही एक आइकन ऑब्जेक्ट को प्रदर्शित करने का तरीका है। इसलिए इन दो आइकनों को ओवरले करने का सबसे आसान तरीका एक नया आइकन ऑब्जेक्ट बनाना है और इसे मेरे मौजूदा सिस्टम में पास करना है। (मुझे एक नई .ico फ़ाइल बनाने की आवश्यकता नहीं है) – demoncodemonkey

उत्तर

16

यहाँ अंतिम समारोह मैं के साथ आया है। यह सोचा था जितना मैंने सोचा था ...
कड़ी मेहनत के लिए इऑन कैंपबेल के लिए धन्यवाद।

public Icon AddIconOverlay(Icon originalIcon, Icon overlay) 
{ 
    Image a = originalIcon.ToBitmap(); 
    Image b = overlay.ToBitmap(); 
    Bitmap bitmap = new Bitmap(16, 16); 
    Graphics canvas = Graphics.FromImage(bitmap); 
    canvas.DrawImage(a, new Point(0, 0)); 
    canvas.DrawImage(b, new Point(0, 0)); 
    canvas.Save(); 
    return Icon.FromHandle(bitmap.GetHicon()); 
} 
+1

यह मेरे लिए काम करता था लेकिन 100% नहीं, मुझे लगातार दो छवियों को चित्रित करते समय गंतव्य आयाम निर्दिष्ट करना पड़ता था या अन्यथा यह उन्हें अपने मूल आकार में आकर्षित करेगा। उदाहरण: 'कैनवास। ड्रॉइमेज (ए, नया आयताकार (0, 0, 16, 16));' –

+0

@ डेविड कैरिगन मुझे लगता है कि दोनों छवियों को 16x16 होना चाहिए अन्यथा उन्हें फसल या आकार बदलने की आवश्यकता होगी। आपकी छवियां क्या आकार हैं? – demoncodemonkey

+1

वे अलग-अलग होंगे ताकि वास्तव में मुझे क्या करना पड़े। बहुत ज्यादा बस एक सिस्टम के एक और तर्क जोड़ा। ड्रॉइंग। आकार प्रकार। इसके बाद बिटमैप बनाने और कैनवास में दो छवियों को चित्रित करते समय गंतव्य आकार निर्दिष्ट करने के लिए संदर्भित किया गया था। –

7

संपादित

पुन: अपनी टिप्पणी: शुरुआत के लिए ... मेरी छवि नहीं काला & पारदर्शी हैं। वे काले और सफेद हैं ... दोनों 0.6f (60%) अस्पष्टता पर सेट हैं, जहां काले (> 100% काला) या सफेद पर सफेद (> 100% सफेद) पर काला है, यह ठीक दिखता है, लेकिन ओवरलैप के लिए आपके पास 60% सफेद काला मिश्रण होगा जो आपको ग्रे रंग देता है ... आप जो कर सकते हैं वह 2 अलग-अलग छवियां बनाएं और यह देखने के लिए अलग-अलग अवसरों को ट्विक करें कि आप अपेक्षित आउटपुट प्राप्त कर सकते हैं (परिवर्तित कोड देखें)। यदि आपकी छवियों में पारदर्शी अनुभाग हैं तो यह अलग-अलग होगा।

से here

कुछ कोड लिया चाल एक पारदर्शिता इतना है कि वे एक दूसरे के माध्यम से देखा जा सकता है के साथ एक चित्र बनाएं किया जा सके। प्रतीक के लिए विशिष्ट नहीं है, इसलिए यह किसी भी छवि प्रकार के लिए काम करना चाहिए। आप ToBitmap() अपने आइकन पहले उन्हें छवि ऑब्जेक्ट्स के रूप में प्राप्त करने के लिए कर सकते हैं।

Merged & Overlaid

using(Image a = Image.FromFile("1.png")) 
    using(Image b = Image.FromFile("2.png")) 
    using (var bitmap = new Bitmap(200, 200)) 
    using (var canvas = Graphics.FromImage(bitmap)) 
    { 
     Rectangle r = new Rectangle(new Point(0, 0), new Size(200, 200)); 
     ColorMatrix cmxPic = new ColorMatrix(); 
      cmxPic.Matrix33 = 1.0f; 

      ImageAttributes iaPic = new ImageAttributes(); 
      iaPic.SetColorMatrix(cmxPic, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 

      ColorMatrix cmxPic2 = new ColorMatrix(); 
      cmxPic2.Matrix33 = 0.5f; 

      ImageAttributes iaPic2 = new ImageAttributes(); 
      iaPic2.SetColorMatrix(cmxPic2, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); 


      canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      canvas.DrawImage(a, r, 0, 0, 200, 200, GraphicsUnit.Pixel, iaPic); 
      canvas.DrawImage(b, r, 0, 0, 200, 200, GraphicsUnit.Pixel, iaPic2); 
     canvas.Save(); 

     bitmap.Save("output.png", ImageFormat.Png); 
    } 
+0

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

+0

मैं थोड़ा जवाब अपडेट करूंगा ... –

+0

आपकी मदद के लिए धन्यवाद, यह पता चला कि यह दोनों से सोचा आसान था :) – demoncodemonkey

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