C# 从剪贴板保存具有透明度的图像

C# 从剪贴板保存具有透明度的图像,c#,image,.net-4.0,imaging,C#,Image,.net 4.0,Imaging,我已经做了一个程序来监控剪贴板,当一个新的图像被复制时,它会被保存到一个文件中。现在,当我从Paint.net复制一个具有透明背景的图像时,背景会被白色填充,但当我从Firefox复制相同的图像时,它保存得很好。下面是我正在使用的测试图像:下面是我用来从剪贴板获取图像的代码: private Image GetImageFromClipboard() { if (Clipboard.GetDataObject() == null) return null;

我已经做了一个程序来监控剪贴板,当一个新的图像被复制时,它会被保存到一个文件中。现在,当我从Paint.net复制一个具有透明背景的图像时,背景会被白色填充,但当我从Firefox复制相同的图像时,它保存得很好。下面是我正在使用的测试图像:下面是我用来从剪贴板获取图像的代码:

private Image GetImageFromClipboard()
    {
        if (Clipboard.GetDataObject() == null) return null;
        if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Dib))
        {
            var dib = ((System.IO.MemoryStream)Clipboard.GetData(DataFormats.Dib)).ToArray();
            var width = BitConverter.ToInt32(dib, 4);
            var height = BitConverter.ToInt32(dib, 8);
            var bpp = BitConverter.ToInt16(dib, 14);
            if (bpp == 32)
            {
                var gch = GCHandle.Alloc(dib, GCHandleType.Pinned);
                Bitmap bmp = null;
                try
                {
                    var ptr = new IntPtr((long)gch.AddrOfPinnedObject() + 40);
                    bmp = new Bitmap(width, height, width * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, ptr);
                    return new Bitmap(bmp);
                }
                finally
                {
                    gch.Free();
                    if (bmp != null) bmp.Dispose();
                }
            }
        }
        return Clipboard.ContainsImage() ? Clipboard.GetImage() : null;
    }
使用上述代码,我保存图像:

Image img = GetImageFromClipboard();
img.RotateFlip(RotateFlipType.Rotate180FlipX);
img.Save("test.png");

从Firefox复制图像时,我也可以看到picturebox中的透明度,但从Paint.net复制图像时,我看不到透明度。

每次复制操作是如何完成的?菜单还是快捷方式?哪个菜单,哪个快捷键?在Paint.net中,我先按CTRL+A选择所有内容,然后按CTRL+C复制。在Firefox中,我只需右击图像并按“复制”。好的。这似乎是剪贴板的问题。我无法将tranparency从Paint.Net复制到Photoshop或从Photoshop复制回来。当然,从Photoshop到Photoshop是有效的;可能是因为他们使用了额外的proprietray格式。。我无法确认它是否适用于firefox,至少在右键单击和复制图形时是这样。所以我无法解决这个问题?我能不能转换一下格式?你可以试试,但我有点怀疑。。我没有尝试过,也许如果Paint.Net到Paint.Net可以工作,那么剪贴板必须包含包含透明度的格式。