2012-06-30 12 views
8

Nota: questa domanda riguarda incollare dagli Appunti, non copiare negli Appunti. Ci sono diversi post sulla copia negli appunti, ma non è stato possibile trovarne uno che risolva questa domanda.Come incollare un'immagine trasparente dagli appunti in un'app winforms C#?

Come posso incollare un'immagine con trasparenza, for example this one, in un'app Winforms e mantenere la trasparenza?

Ho provato a utilizzare System.Windows.Forms.GetImage(), ma questo produce una bitmap con uno sfondo nero.

Sto copiando questa immagine da Google Chrome, che supporta diversi formati di appunti, tra cui DeviceIndependentBitmap e Format17.

+0

in realtà, sembra Chrome in realtà non mettere valida 'Format17' sul suo appunti, e non lo fa manag e per incollare 'Format17' quando lo metto negli appunti a livello di programmazione. – Nyerguds

risposta

12

Chrome copia l'immagine negli Appunti in un formato 24 bpp. Che trasforma la trasparenza in nero. È possibile ottenere un formato 32bpp dagli Appunti ma è necessario gestire il formato DIB. Non c'è alcun supporto integrato per quella in System.Drawing, hai bisogno di una funzione di supporto poco che rendono la conversione: utilizzo

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

Esempio:

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

che ha prodotto questo screen-shot con la forma del BackgroundImage insieme di proprietà di uno stock bitmap:

enter image description here

+0

Brillante. Grazie mille. – bright

+2

Appena notato - le immagini vengono ruotate di 180 gradi! L'immagine sopra è anche ruotata rispetto all'originale. Qualche idea del perché? – bright

+2

Sono stato in grado di aggirare questo problema con image.RotateFlip (SD.RotateFlipType.Rotate180FlipX). Non so perché il codice sopra causa la rotazione e il capovolgimento, però. – bright

Problemi correlati