如果它包含图像,我试图从剪贴板写一个文件。由于剪贴板可以包含任何深度的图像(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 Photoshop
和Microsoft Power Point
将图像复制到剪贴板。我开始意识到Microsoft Power Point
图像是32 bit
而Photoshop
是24 bit
。但这不是问题,因为BitmapFromDIB()
会解决这个问题。
除透明度外,一切正常。如果图像是透明的,则BitmapFromDIB
不尊重该图像。它会忽略Alpha
频道。对于32 bit
张图片,我更改了32 bit
对PixelFormat
的处理,并更改了
fmt = PixelFormat.Format32bppRgb;
到
fmt = PixelFormat.Format32bppArgb;
但这不是一个理想的解决方案,因为即使原始Dib Stream没有alpha通道,它也会添加到它。所以这是第一个问题的第一部分。
第二部分适用于24 bit
图片,因为没有任何PixelFromat
here与Alpha有24位。结果如下。
如左图所示,图像中心透明,但结果不透明。
我遇到的另一个问题是来自Power Point
的{{1}}图像,它们是如何向右移动4-5像素,文字也不平滑,这可能是一个别名的东西。但更亮的一面是透明区域在32位图像中是透明的。
如何在从DIB转换为Bitmap时处理透明度?
为什么图像在32 bit
图像中向右移动?
任何帮助都会非常感激。
答案 0 :(得分:1)
我可以在移位的图像上回答最后一期。
DIB有多种格式,由标题中的“压缩”选项指定。这不仅限于实际压缩格式,而是包含与标准不同的各种格式,因此在处理数据之前应始终检查它。如果格式使用压缩类型3(BI_BITFIELDS
)而不是0(BI_RGB
),则图像数据以三个Int32位掩码开始,这些掩码指定要读取哪些位以获取R,G和B 32位像素的组件。通常,这些设置为默认的预期值(R为0x00FF0000,G为0x0000FF00,B为0x000000FF),因此,如果它们是,您实际上不需要对数据本身做任何特殊操作,但不管怎样,您仍然当然,我们需要跳过这12个字节,否则它们会在图像上显示为三个像素。
很明显,您的DIB方法缺乏。我写了自己的;你可以在这个答案中查看它们: