2009-06-15 12 views
8

Je suis en train d'enregistrer une image copiée dans le presse-papiers, mais il perd son canal alpha:Comment puis-je sortir une image du presse-papiers sans perdre le canal alpha dans .NET?

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

Si je copie une image 32 bits de PhotoShop ou IE/Firefox/Chrome et exécutez le code ci-dessus, la sortie perd son canal alpha, à la place il est sauvegardé sur un fond noir.

L'image est enregistrée en tant que PNG, qui peut contenir un canal alpha.

des données indiquées semble être dans le presse-papiers car coller dans d'autres applications (comme PhotoShop) conserve le canal alpha.

Quelqu'un peut-il me mettre hors de ma misère?

Merci d'avance!

Mise à jour:

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

qui précède suggère que les données alpha est perdue dès qu'il est sorti du presse-papier. Peut-être devrais-je le sortir du presse-papiers d'une autre façon?

+3

+1 juste pour l'utilisation correcte de c'est et sa – Kevin

+0

bonne question. Si vous avez résolu, peut-être que vous voulez mettre à jour votre question avec un code de travail, s'il vous plaît? – Nasenbaer

Répondre

7

Au lieu d'appeler Clipboard.GetImage(), essayez d'appeler Clipboard.GetDataObject()

Ce retourne un IDataObject, qui vous pouvez à son tour interroger en appelant dataObject.GetFormats(). GetFormats() renvoie les formats de type pris en charge par l'objet Presse-papiers. Il existe peut-être un format plus précis pris en charge que vous pouvez utiliser pour extraire les données.

+3

Ceci est la La solution la plus probable Le format d'image générique dans le presse-papiers est confronté à deux décennies de compatibilité rétroactive Il est presque certain que Windows convertit délibérément n'importe quelle image 32 bits en 24 bits lorsqu'elle est demandée au format CFBITMAP – David

+1

Je n'ai pas touché le presse-papiers longtemps, mais en vérifiant MSDN il ressemble au format spécifique que vous voulez vérifier pour CF_DIBV5, qui est le format pour les images avec des informations de couleur étendue (canal alpha, plus de 8 bits par couleur, etc) – David

+0

On dirait que le problème est beaucoup plus compliqué que je pensais, et je me suis trompé quand j'ai dit que je pouvais copier des images à partir de navigateurs PhotoShop et conserver la transparence. Je peux copier dans PhotoShop, mais je suppose que c'est juste une référence à la couche dans le presse-papiers, plutôt que les données d'image. "Adobe Photoshop Image" est l'un des formats retournés par GetFormats, mais je reçois simplement une valeur nulle lorsque j'essaie de lire ces données. Un grand merci pour toute l'aide! –

0

L'image est enregistrée en tant que bitmap où les pixels transparents sont visibles sur le presse-papiers afin d'utiliser ce code

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

MakeTransparent ne fera qu'une seule couleur transparente, l'information alpha est perdue avant cette ligne :( –

+0

Je sais que cela fonctionne correctement lorsque j'ai copié une image de firefox à mon programme, mais je vois qu'il n'a pas copié les ombres portées – Jim

0

J'utilise simplement Methode Forms. Ce n'est pas une bonne solution comme utiliser GetFormat comme Kevin nous dit mais c'est plus rapide et fonctionne bien du tout.

'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 
Questions connexes