2012-06-30 70 views
8

Lưu ý: Câu hỏi này là về việc dán từ khay nhớ tạm, không sao chép vào khay nhớ tạm. Có một số bài viết về việc sao chép vào clipboard, nhưng không thể tìm thấy một bài viết giải quyết câu hỏi này.Làm cách nào để dán hình ảnh trong suốt từ khay nhớ tạm vào ứng dụng C# winforms?

Làm cách nào để dán hình ảnh có độ trong suốt, for example this one, vào ứng dụng biểu mẫu winforms và giữ được độ trong suốt?

Tôi đã thử sử dụng System.Windows.Forms.GetImage(), nhưng điều đó tạo ra một bitmap với nền đen.

Tôi đang sao chép hình ảnh này từ Google Chrome, hỗ trợ một số định dạng clipboard, bao gồm DeviceIndependentBitmapFormat17.

+0

trên thực tế, có vẻ như Chrome không thực sự đặt hợp lệ 'Format17' vào clipboard của nó, nó cũng không phải manag e để dán 'Format17' khi tôi đặt nó vào clipboard theo chương trình. – Nyerguds

Trả lời

12

Chrome sao chép hình ảnh vào khay nhớ tạm ở định dạng 24bpp. Mà biến tính minh bạch thành màu đen. Bạn có thể nhận được một định dạng 32bpp trong clipboard nhưng điều đó đòi hỏi phải xử lý định dạng DIB. Không có built-in hỗ trợ cho rằng trong System.Drawing, bạn cần một hàm helper ít mà làm cho việc chuyển đổi: sử dụng

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

mẫu:

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

nào sản xuất này màn hình-shot với các hình thức của BackgroundImage bất động sản thiết lập để một bitmap chứng khoán:

enter image description here

+0

Rực rỡ. Cảm ơn bao giờ hết. – bright

+2

Chỉ cần chú ý - hình ảnh được xoay 180 độ! Hình ảnh trên cũng được xoay từ ảnh gốc. Bất kỳ ý tưởng tại sao? – bright

+2

Tôi đã có thể làm việc xung quanh điều này với image.RotateFlip (SD.RotateFlipType.Rotate180FlipX). Tuy nhiên, không biết tại sao mã trên gây ra xoay và lật. – bright

Các vấn đề liên quan