2012-06-30 32 views
8

Not: Bu soru panoya kopyalamak değil, panoya yapıştırmaktır. Panoya kopyalama hakkında birkaç yayın var, ancak bu soruyu ele alan bir cevap bulamadı.C# winforms uygulamasında panodan saydam bir görüntü nasıl yapıştırılır?

Saydamlık, for example this one ile bir görüntüyü nasıl winform uygulamasına yapıştırabilir ve saydamlığı koruyabilirim?

System.Windows.Forms.GetImage() kullanmayı denedim, ancak siyah bir arka plana sahip bir bitmap üretiyor.

Bu resmi, DeviceIndependentBitmap ve Format17 dahil olmak üzere çeşitli pano biçimlerini destekleyen Google Chrome'dan kopyalıyorum.

+0

, aslında kendi panosuna geçerli 'Format17' koymuyor Chrome görünüyor, ne de o Manag yapar Ben programa göre panoya koyduğumda 'Format17' yapıştırmak için. – Nyerguds

cevap

12

Chrome, resmi panoya 24bpp biçiminde kopyalar. Şeffaflığı siyaha çevirir. Panodan 32bpp formatı alabilirsiniz, ancak DIB formatını kullanmanız gerekir.

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; 
    } 

Örnek kullanım: Orada yerleşik hiçbir oluyor System.Drawing bunun için destek, sen dönüşüm yapmak biraz yardımcı işlevi ihtiyaç formu en bu ekran-shot üretti

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

bir stok bitmap Backgroundımage özellik kümesi: aslında

enter image description here

+0

Parlak. Çok teşekkür ederim. – bright

+2

Sadece fark edildi - görüntüler 180 derece döndürülüyor! Yukarıdaki görüntü de orijinalden döndürülür. Bir fikrin neden? – bright

+2

Bu konuda image.RotateFlip (SD.RotateFlipType.Rotate180FlipX) ile çalışabildim. Yukarıdaki kodun neden döndürme ve çevirme nedenine neden olduğunu bilmiyorum. – bright

İlgili konular