2009-06-15 12 views
8

Próbuję zapisać skopiowany obraz ze schowka ale to traci swój kanał alpha:Jak mogę uzyskać obraz ze schowka bez utraty kanału alfa w .NET?

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

Gdybym skopiować obraz 32-bitowy Photoshop lub IE/Firefox/Chrome i uruchomić powyższy kod, wyjście traci swój kanał alfa, zamiast tego jest zapisywany na czarnym tle.

Zdjęcie zostanie zapisane jako PNG, które może zawierać kanał alfa.

Poprawne dane znajdują się w schowku, ponieważ wklejenie do innych aplikacji (takich jak PhotoShop) zachowuje kanał alfa.

Czy ktoś może mnie wyrzucić z mojej nędzy?

Z góry dziękuję!

Aktualizacja:

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

Powyższe dane wskazują, że alfa jest stracone tak szybko, jak jest to zrobione z schowka. Być może muszę go usunąć ze schowka w inny sposób?

+3

+1 tylko dla prawidłowego użycia jego i jego dobrego pytania: – Kevin

+0

. jeśli rozwiązałeś, może chcesz zaktualizować swoje pytanie za pomocą działającego kodu? – Nasenbaer

Odpowiedz

7

Zamiast wywoływać Clipboard.GetImage(), spróbuj dzwoniąc Clipboard.GetDataObject()

ta zwraca IDataObject, który możesz z kolei zapytać, dzwoniąc pod numer dataObject.GetFormats(). GetFormats() zwraca formaty czcionek obsługiwane przez obiekt Clipboard - może być obsługiwany bardziej precyzyjny format, którego można użyć do wyodrębnienia danych.

+3

To jest najprawdopodobniej rozwiązanie: ogólny format obrazu w schowku ma 2 dziesięciolecia wstecznej zgodności, z którym można się uporać.) Jest prawie pewne, że Windows celowo konwertuje dowolny obraz 32-bitowy do 24-bitowego, gdy jest wymagany w formacie CFBITMAP. – David

+1

Nie dotknąłem schowka w przez długi czas, ale sprawdzanie MSDN wygląda jak konkretny format, który chcesz sprawdzić dla CF_DIBV5, który jest formatem dla obrazów z rozszerzonymi informacjami o kolorach (kanał alfa, więcej niż 8 bitów na kolor, itp.) – David

+0

Wygląda na to, że problem jest o wiele bardziej skomplikowane, niż myślałem, i pomyliłem się, kiedy powiedziałem, że mogę kopiować obrazy z przeglądarek do PhotoShop i zachować przezroczystość. Mogę skopiować w PhotoShop, ale myślę, że to po prostu przechowywanie odniesienia do warstwy w schowku, a nie dane obrazu. "Obraz Adobe Photoshop" jest jednym z formatów zwracanych przez GetFormats, ale po próbie i odczytaniu tych danych po prostu otrzymuję wartość null. Wielkie dzięki za pomoc! –

0

Obraz jest zapisywany w postaci bitmapy, gdzie przezroczyste piksele są widoczne w schowku więc użyć tego kodu

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

MakeTransparent spowoduje, że pojedynczy kolor będzie przezroczysty, informacja alfa zostanie utracona przed tą linią :( –

+0

Wiem, że działa poprawnie, gdy skopiowałem obraz z FireFox do mojego programu, ale widzę, że nie skopiował on cieniowania. – Jim

0

Używam tylko metody Metod. To niezbyt fajne rozwiązanie, takie jak używanie polecenia, jak Kevin mówi nam, ale jest szybsze i działa w ogóle dobrze.

'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 
Powiązane problemy