2009-06-15 16 views
8

che sto cercando di salvare un'immagine copiata dagli appunti, ma si tratta di perdere il suo canale alfa:Come posso ottenere un'immagine dagli Appunti senza perdere il canale alfa in .NET?

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

Se copio un'immagine a 32 bit da Photoshop o IE/Firefox/Chrome ed eseguire il codice di cui sopra, l'uscita perde il suo canale alfa, invece viene salvato su uno sfondo nero.

L'immagine viene salvata come PNG, che può contenere un canale alfa.

I dati corretti sembrano essere negli appunti perché incollare in altre applicazioni (come PhotoShop) mantiene il canale alfa.

Qualcuno può mettermi fuori dalla mia sofferenza?

Grazie in anticipo!

Aggiornamento:

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

È possibile che questo suggerisce che i dati alfa si perde non appena è preso fuori dalla clipboard. Forse ho bisogno di tirarlo fuori dagli appunti in qualche altro modo?

+3

+1 solo per l'uso corretto di esso e la sua buona domanda – Kevin

+0

. se hai risolto, forse vuoi aggiornare la tua domanda con un codice funzionante, per favore? – Nasenbaer

risposta

7

Invece di chiamare Clipboard.GetImage(), provare a chiamare Clipboard.GetDataObject()

Questa restituisce un IDataObject, che puoi a sua volta interrogare chiamando dataObject.GetFormats(). GetFormats() restituisce i formati di testo supportati dall'oggetto Clipboard: potrebbe essere disponibile un formato più preciso che è possibile utilizzare per estrarre i dati.

+3

Questo è il La soluzione più probabile Il formato di immagine generico negli Appunti ha due decadi di compatibilità con le versioni precedenti. È quasi certo che Windows converte deliberatamente qualsiasi immagine a 32 bit a 24 bit quando è richiesta in formato CFBITMAP – David

+1

Non ho toccato gli appunti in molto tempo, ma controllando MSDN sembra il formato specifico che si desidera controllare per CF_DIBV5, che è il formato per immagini con informazioni a colori estese (canale alfa, più di 8 bit per colore, ecc.) – David

+0

Sembra che il problema sia molto più complicato di quanto pensassi, e mi sono sbagliato quando ho detto che potevo copiare le immagini dai browser a PhotoShop e mantenere la trasparenza. Posso copiare all'interno di PhotoShop, ma suppongo che stia semplicemente memorizzando un riferimento al livello negli appunti, piuttosto che i dati dell'immagine. "Adobe Photoshop Image" è uno dei formati restituiti da GetFormats, ma ottengo semplicemente null quando provo a leggere questi dati. Mille grazie per tutto l'aiuto! –

0

L'immagine viene salvata come bitmap in cui i pixel trasparenti sono visibili sul clipboard usa questo codice

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

MakeTransparent renderà un solo colore trasparente, l'informazione alfa viene persa prima di quella riga :( –

+0

So che funziona correttamente quando ho copiato un'immagine da firefox nel mio programma, ma vedo che non ha copiato le ombre esterne – Jim

0

Sto solo usando il metodo Forms. Non è una buona soluzione come usare GetFormat come Kevin ci sta dicendo, ma è più veloce e funziona bene bene affatto.

'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 
Problemi correlati