2009-06-15 12 views
8

estoy tratando de guardar una imagen copiada desde el portapapeles, pero no consigue perder su canal alfa:¿Cómo puedo obtener una imagen del portapapeles sin perder el canal alfa en .NET?

Image clipboardImage = Clipboard.GetImage(); 
string imagePath = Path.GetTempFileName(); 
clipboardImage.Save(imagePath); 

Si copio una imagen de 32 bits de Photoshop o IE/Firefox/Chrome y ejecutar el código anterior, la salida pierde su canal alfa, en cambio se guarda contra un fondo negro.

La imagen se guarda como PNG, que puede contener un canal alfa.

Parece que los datos correctos están en el portapapeles porque pegar en otras aplicaciones (como PhotoShop) retiene el canal alfa.

¿Alguien puede sacarme de mi miseria?

¡Gracias de antemano!

Actualización:

// outputs FALSE 
Debug.WriteLine(Image.IsAlphaPixelFormat(Clipboard.GetImage().PixelFormat)); 

Lo anterior sugiere que los datos alfa se pierde en cuanto se saca del portapapeles. ¿Quizás necesito sacarlo del portapapeles de alguna otra manera?

+3

+1 sólo para el uso apropiado de su y – Kevin

+0

buena pregunta. Si lo has resuelto, quizás quieras actualizar tu pregunta con un código de trabajo, por favor. – Nasenbaer

Respuesta

7

En lugar de llamar Clipboard.GetImage(), intente llamar Clipboard.GetDataObject()

Esto devuelve un IDataObject, que a su vez puede consultar llamando al dataObject.GetFormats(). GetFormats() devuelve los formatos de tipo admitidos por el objeto del Portapapeles; puede haber un formato más preciso compatible que pueda usar para extraer los datos.

+3

Esta es la El formato de imagen genérico en el portapapeles tiene 2 décadas de compatibilidad con versiones anteriores. Es casi seguro que Windows convierte deliberadamente cualquier imagen de 32 bits a 24 bits cuando se solicita en formato CFBITMAP. – David

+1

No he tocado el portapapeles en durante mucho tiempo, pero al revisar MSDN se ve como el formato específico que desea verificar para CF_DIBV5, que es el formato para imágenes con información de color extendida (canal alfa, más de 8 bits por color, etc.) – David

+0

Parece que el problema es mucho más complicado de lo que pensaba, y me equivoqué cuando dije que podía copiar imágenes de los navegadores a PhotoShop y conservar la transparencia. Puedo copiar dentro de PhotoShop, pero supongo que es solo almacenar una referencia a la capa en el portapapeles, en lugar de los datos de la imagen. "Adobe Photoshop Image" es uno de los formatos devueltos por GetFormats, pero simplemente obtengo un valor nulo cuando intento leer estos datos. ¡Muchas gracias por toda la ayuda! –

0

La imagen se guarda como un mapa de bits, donde los píxeles transparentes son visibles en el portapapeles para usar este código

Bitmap clipboardImage = Clipboard.GetImage(); 
clipboardImage.MakeTransparent() 
string imagePath = Path.GetTempFileName(); 
clipboardImage.Save(imagePath); 
+0

MakeTransparent solo hará que un solo color sea transparente, la información alfa se perderá antes de esa línea :( –

+0

Sé que funciona correctamente cuando copié una imagen de Firefox a mi programa, pero veo que no ha copiado las sombras – Jim

0

Solo estoy usando Forms methode. No es una solución tan buena como usar GetFormat como Kevin nos dice, pero es más rápido y funciona bien en absoluto.

'Dim bm As BitmapSource = Clipboard.GetImage()'looses alpha channel 
       'Dim bmS As New WriteableBitmap(bm)'does work but still without alpha information 
       Dim bmF As System.Drawing.Bitmap = System.Windows.Forms.Clipboard.GetImage 'Get working image 
       Dim bmS As BitmapSource = TB.Imaging.WPF.BitmapToWpfBitmapSource(bmF, Me) 'convert Bitmap into BitmapSource 
       Me.Source = bmS 
Cuestiones relacionadas