来自WPF剪贴板的24位图像的透明度问题

时间:2013-12-14 19:15:37

标签: c# .net wpf transparency clipboard

如果它包含图像,我试图从剪贴板写一个文件。由于剪贴板可以包含任何深度的图像(8/16/24/32位),或者它也可以包含alpha通道。 我正在做的是,首先检查数据对象。如果它有数据对象,那么我检查DataFormat是否为Dib,获取Dib Stream并将其转换为System.Drawing.Bitmap进行转换我从{{3获取了代码}}

if (Clipboard.GetDataObject() == null) 
    return null;

if (Clipboard.GetDataObject().GetDataPresent(DataFormats.Dib))
{
    MemoryStream dibStream = Clipboard.GetData(DataFormats.Dib) as MemoryStream;
    Bitmap img = DIBitmaps.DIB.BitmapFromDIB(dib); //taken from link provided
    img.Save(@"output.png",ImageFormat.Png);
}

对于输入图像,我使用Adobe PhotoshopMicrosoft Power Point将图像复制到剪贴板。我开始意识到Microsoft Power Point图像是32 bitPhotoshop24 bit。但这不是问题,因为BitmapFromDIB()会解决这个问题。

除透明度外,一切正常。如果图像是透明的,则BitmapFromDIB不尊重该图像。它会忽略Alpha频道。对于32 bit张图片,我更改了32 bitPixelFormat的处理,并更改了

fmt = PixelFormat.Format32bppRgb;

fmt = PixelFormat.Format32bppArgb;

但这不是一个理想的解决方案,因为即使原始Dib Stream没有alpha通道,它也会添加到它。所以这是第一个问题的第一部分。

第二部分适用于24 bit图片,因为没有任何PixelFromat here与Alpha有24位。结果如下。

enter image description here

如左图所示,图像中心透明,但结果不透明。

我遇到的另一个问题是来自Power Point的{​​{1}}图像,它们是如何向右移动4-5像素,文字也不平滑,这可能是一个别名的东西。但更亮的一面是透明区域在32位图像中是透明的。

如何在从DIB转换为Bitmap时处理透明度? 为什么图像在32 bit图像中向右移动?

任何帮助都会非常感激。

enter image description here

1 个答案:

答案 0 :(得分:1)

我可以在移位的图像上回答最后一期。

DIB有多种格式,由标题中的“压缩”选项指定。这不仅限于实际压缩格式,而是包含与标准不同的各种格式,因此在处理数据之前应始终检查它。如果格式使用压缩类型3(BI_BITFIELDS)而不是0(BI_RGB),则图像数据以三个Int32位掩码开始,这些掩码指定要读取哪些位以获取R,G和B 32位像素的组件。通常,这些设置为默认的预期值(R为0x00FF0000,G为0x0000FF00,B为0x000000FF),因此,如果它们是,您实际上不需要对数据本身做任何特殊操作,但不管怎样,您仍然当然,我们需要跳过这12个字节,否则它们会在图像上显示为三个像素。

很明显,您的DIB方法缺乏。我写了自己的;你可以在这个答案中查看它们:

A: Copying From and To Clipboard loses image transparency