Как я могу получить изображение из буфера обмена, не теряя альфа-канал в .NET? - PullRequest
8 голосов
/ 16 июня 2009

Я пытаюсь сохранить скопированное изображение из буфера обмена, но теряет свой альфа-канал:

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

Если я копирую 32-битное изображение из PhotoShop или IE / Firefox / Chrome и запускаю приведенный выше код, вывод теряет свой альфа-канал, вместо этого он сохраняется на черном фоне.

Изображение сохраняется в формате PNG, которое может содержать альфа-канал.

В буфере обмена отображаются правильные данные, поскольку при вставке в другие приложения (например, PhotoShop) сохраняется альфа-канал.

Кто-нибудь может избавить меня от моих страданий?

Заранее спасибо!

Обновление:

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

Вышесказанное предполагает, что альфа-данные теряются, как только они вынимаются из буфера обмена. Возможно, мне нужно каким-то другим способом вытащить его из буфера обмена?

Ответы [ 4 ]

7 голосов
/ 16 июня 2009

Вместо того, чтобы звонить Clipboard.GetImage(), попробуйте позвонить Clipboard.GetDataObject()

Возвращает объект IDataObject, который вы, в свою очередь, можете запросить, вызвав dataObject.GetFormats(). GetFormats() возвращает форматы типов, поддерживаемые объектом Clipboard - возможно, существует более точный формат, который можно использовать для извлечения данных.

3 голосов
/ 16 июня 2009

Может показаться, что эта статья предполагает, что объект Clipboard, работающий в Win32, может управлять только растровыми изображениями, которые не имеют прозрачного / частично прозрачного альфа-канала. Буфер обмена OLE кажется более способным:

Тем не менее, netez была лучшей статьей, которую я нашел по этой теме. (будьте осторожны, я не проверял это сам)

0 голосов
/ 25 октября 2011

Я просто использую метод Forms. Это не то хорошее решение, как использование GetFormat, как говорит нам Кевин, но более быстрое и хорошо работающее.

  '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
0 голосов
/ 16 июня 2009

Изображение сохраняется как растровое изображение, где прозрачные пиксели видны в буфере обмена, поэтому используйте этот код

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