2012-06-30 6 views
8

नोट: यह प्रश्न क्लिपबोर्ड से चिपकाने के बारे में है, क्लिपबोर्ड पर प्रतिलिपि नहीं। क्लिपबोर्ड पर प्रतिलिपि बनाने के बारे में कई पोस्ट हैं, लेकिन इस प्रश्न को संबोधित करने वाले व्यक्ति को नहीं मिला।सी # Winforms ऐप में क्लिपबोर्ड से एक पारदर्शी छवि पेस्ट करने के लिए कैसे?

मैं एक छवि को पारदर्शिता, for example this one, एक Winforms ऐप में कैसे पेस्ट कर सकता हूं और पारदर्शिता बरकरार रख सकता हूं?

मैंने System.Windows.Forms.GetImage() का उपयोग करने का प्रयास किया है, लेकिन यह एक काला पृष्ठभूमि के साथ एक बिटमैप पैदा करता है।

मैं इस छवि को Google क्रोम से कॉपी कर रहा हूं, जो DeviceIndependentBitmap और Format17 सहित कई क्लिपबोर्ड प्रारूपों का समर्थन करता है।

+0

वास्तव में, यह वास्तव में अपने क्लिपबोर्ड पर डाल नहीं है मान्य 'Format17' क्रोम लगता है, और न ही यह प्रबंध करता है ई 'स्वरूप 17' पेस्ट करने के लिए जब मैं इसे क्लिपबोर्ड पर प्रोग्रामेटिक रूप से डालता हूं। – Nyerguds

उत्तर

12

क्रोम क्लिप को 24bpp प्रारूप में क्लिपबोर्ड पर कॉपी करता है। जो पारदर्शिता को काला में बदल देता है। आप क्लिपबोर्ड से 32 बीपीपी प्रारूप प्राप्त कर सकते हैं लेकिन इसके लिए डीआईबी प्रारूप को संभालने की आवश्यकता है।

private Image GetImageFromClipboard() { 
     if (Clipboard.GetDataObject() == null) return null; 
     if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Dib)) { 
      var dib = ((System.IO.MemoryStream)Clipboard.GetData(DataFormats.Dib)).ToArray(); 
      var width = BitConverter.ToInt32(dib, 4); 
      var height = BitConverter.ToInt32(dib, 8); 
      var bpp = BitConverter.ToInt16(dib, 14); 
      if (bpp == 32) { 
       var gch = GCHandle.Alloc(dib, GCHandleType.Pinned); 
       Bitmap bmp = null; 
       try { 
        var ptr = new IntPtr((long)gch.AddrOfPinnedObject() + 40); 
        bmp = new Bitmap(width, height, width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, ptr); 
        return new Bitmap(bmp); 
       } 
       finally { 
        gch.Free(); 
        if (bmp != null) bmp.Dispose(); 
       } 
      } 
     } 
     return Clipboard.ContainsImage() ? Clipboard.GetImage() : null; 
    } 

नमूना उपयोग:: वहाँ में निर्मित है कि System.Drawing में के लिए समर्थन नहीं है, तो आप एक छोटे से सहायक समारोह है कि रूपांतरण बनाने की जरूरत है

protected override void OnPaint(PaintEventArgs e) { 
     using (var bmp = GetImageFromClipboard()) { 
      if (bmp != null) e.Graphics.DrawImage(bmp, 0, 0); 
     } 
    } 

कौन सा रूप के साथ इस स्क्रीन-शॉट का उत्पादन एक शेयर बिटमैप को BackgroundImage संपत्ति सेट:

enter image description here

+0

शानदार। बहुत बहुत धन्यवाद। – bright

+2

बस ध्यान दिया - छवियों 180 डिग्री घूर्णन कर रहे हैं! ऊपर की छवि मूल से भी घुमाया गया है। कोई विचार क्यों? – bright

+2

मैं छवि के साथ इस के आसपास काम करने में सक्षम था। RotateFlip (SD.RotateFlipType.Rotate180FlipX)। पता नहीं क्यों उपर्युक्त कोड घूर्णन और फ्लिप का कारण बनता है। – bright

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