views:

935

answers:

3

I'm trying to save a copied image from the clipboard but it's losing its alpha channel:

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

If I copy a 32bit image from PhotoShop or IE/Firefox/Chrome and run the above code, the output loses its alpha channel, instead it is saved against a black background.

The image is saved as PNG, which can contain an alpha channel.

The correct data appears to be in the clipboard because pasting into other applications (such as PhotoShop) retains the alpha channel.

Can anyone put me out of my misery?

Thanks in advance!

Update:

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

The above suggests that the alpha data is lost as soon as it's taken out of the clipboard. Perhaps I need to get it out of the clipboard some other way?

A: 

The image is being saved as a bitmap where the transparent pixels are visible on the clipboard so use this code

Bitmap clipboardImage = Clipboard.GetImage();
clipboardImage.MakeTransparent()
string imagePath = Path.GetTempFileName();
clipboardImage.Save(imagePath);
Jim
MakeTransparent will only make a single colour transparent, the alpha information is lost before that line :(
Jaffa The Cake
I know it works properly when i copied an image from firefox to my program, but i see that it didnt copy drop shadows
Jim
+4  A: 

Instead of calling Clipboard.GetImage(), try calling Clipboard.GetDataObject()

This returns an IDataObject, which you can in turn query by calling dataObject.GetFormats(). GetFormats() returns the type formats supported by the Clipboard object - there may be a more precise format supported that you can use to extract the data.

Kevin Pullin
This is the most likely solution. The generic image format on the clipboard has 2 decades of backwards compatiblity to contend with. It's almost certain that Windows deliberately converts any 32bit image down to 24bit when it's requested in CFBITMAP format.
David
I haven't touched the clipboard in a long time, but checking MSDN it looks like the specific format you want to check for CF_DIBV5, which is the format for images with extended color information (alpha channel, more then 8bits per color, etc)
David
Looks like the problem is much more complicated than I thought, and I was mistaken when I said I could copy images from browsers to PhotoShop and retain transparency.I can copy within PhotoShop, but I guess it's just storing a reference to the layer on the clipboard, rather than the image data."Adobe Photoshop Image" is one of the formats returned by GetFormats, but I simply get null when I try and read this data.Many thanks for all the help!
Jaffa The Cake
+2  A: 

It might be like this article suggests, that the Clipboard object, working within Win32, is only able to manage bitmaps, which don't feature the transparent/partially transparent alpha channel. The OLE clipboard is more capable, it seems:

However, the netez was the best article I found on the topic. (beware I haven't tested this myself)

Henrik