- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个剪贴板管理器(可以在这里看到:http://flamefusion.net/software/shapeshifter)。
但是,我目前遇到位图 (bmp
) 问题,它无法真正正确地将自身插入到剪贴板中。我的第一种方法如下,使用 SetClipboardData
。
var hBitmap = bmp.GetHBitmap();
SetClipboardData(CF_BITMAP, hBitmap);
我知道其中可能存在内存泄漏,它只是作为测试而制作的。测试失败。粘贴到剪贴板中的图像在粘贴时无法被 Paint 读取。
经过大量的研究和失败的尝试,我得到了一个新的理论。我使用的位图是从 MemoryStream
创建的,它是通过先前调用 Bitmap.Save(Stream, ImageFormat)
方法创建的。这让我相信 System.Drawing.Bitmap
的 GetHBitmap
不是 HBITMAP
SetClipboardData
函数期望。
所以我尝试了以下方法,并取得了一定的成功。
var memDC = CreateCompatibleDC(IntPtr.Zero);
var memBitmap = CreateCompatibleBitmap(memDC, bmp.Width, bmp.Height);
SetClipboardData(CF_BITMAP, memBitmap);
现在插入的图像尺寸正确,但为黑色图像。这是很明显的,因为除了宽度和高度之外,bmp
中没有任何内容实际用于创建“兼容”位图。
我假设我必须以某种方式使用 BitBlt 将我的原始位图复制到这个现在“兼容”的位图中,但我不知道从哪里开始。
你们中的任何一个 GDI 向导都知道吗?这里显然需要魔法。
编辑 1正如 dthorpe 很好地指出的那样,我的问题似乎是我要保存的图像实际上是一个 DIB。现在问题变了。我需要弄清楚如何将 DIB 转换为 DDB。我知道在执行此操作时会出现 alpha 损失,但它仍然是必需的。
编辑 2使用 Clipboard.SetImage
是 Not Acceptable 。这在我的场景中不起作用。我需要使用 API。
最佳答案
CF_BITMAP 可能是用于位图的错误格式。 CF_BITMAP 剪贴板格式指定了设备位图,但如今几乎所有位图都是 DIB——设备独立位图。设备位图与系统/硬件设备调色板相关(想想 EGA 图形),并且必须与当前显示模式的像素格式相匹配。 DIB 带有它们自己的颜色信息,它们的像素格式独立于显示模式。
文档说,如果应用程序在从剪贴板读取时请求 CF_DIB,剪贴板管理器会将 CF_BITMAP 转换为 CF_DIB,但假设原始图像实际上是当前显示模式像素格式的设备位图。如果不是,转换将产生垃圾,因为输入是垃圾。
使用 CF_DIB 而不是 CF_BITMAP 再试一次。
关于c# - 将 DIB 转换为 DDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12162676/
我有一个 my_table ,其复合排序键由两个组合属性 id 和 model_name (即 id_model_name)组成code>,与此处所做的类似 here 和 here )。 所以我创建了
我已经在 Jquery 中完成了这一点,但希望在 Javascript 中实现而不依赖于任何库。 $("br",document).parent().contents().each(functio
我正在开发一个剪贴板管理器(可以在这里看到:http://flamefusion.net/software/shapeshifter)。 但是,我目前遇到位图 (bmp) 问题,它无法真正正确地将自身
我正在尝试使用带有 Javascript SDK 的 UpdateItem 将一个字符串集添加到项目内的另一个字符串集上 我的参数是这样的: var params = {
我试图通过对像素值数组进行硬编码来创建位图,将此像素数组转换为 DIB,然后将此 DIB 转换为 DDB。在网上找了两个转换CreateBitmapFromPixels和DIBToDDB的函数。我的问
我想在 Firebase 中写入数据,但出现权限错误,这是我尝试过的: void initState() { super.initState(); testFirebase(); }
我有一个 DynamoDB 表,我需要连接到 EMR Spark SQL 以在该表上运行查询。我得到了带有发布标签 emr-4.6.0 和 Spark 1.6.1 的 EMR Spark Cluste
我是一名优秀的程序员,十分优秀!