如何从Windows剪贴板获取图像数据

4
我正在尝试使用Golang编写程序,从Windows剪贴板获取图像数据。
我知道有一个插件可以从Windows剪贴板获取数据(链接),但它不支持图像数据,只支持文本。基本上不是我要找的东西。
package main

import ("fmt"
        "github.com/atotto/clipboard"
)


func main()  {
    str,err:=clipboard.ReadAll()
    if err!=nil {
        fmt.Println(err)        
    }else {
        fmt.Println(str)
    }
}

如果剪贴板包含图像,将输出“操作成功完成”的错误信息。 有什么想法吗? 更新!: 我尝试将CF_BITMAP传递给GetClipboardData,它会返回一个位图句柄(Hbitmap)。我不熟悉处理该内容,但显然它是一个长的无符号数字? 无论如何,我尝试了一些谷歌搜索结果,看到了这里:this。使用函数GdipCreateBitmapFromHBITMAP:
var Bitmap *win.GpBitmap
pBitmap := &Bitmap
fmt.Println(win.GdipCreateBitmapFromHBITMAP(win.HBITMAP(Hbitmap),0,pBitmap))

我得到了“ok”的输出,但位图为空。我又卡住了。
我该如何存储位图?

你解决了吗? - Changkun
2个回答

4

对于仍在寻找解决方案的人,这里有一个活跃的 Go 包,可以处理 UTF8 和图像剪贴板数据:

https://github.com/golang-design/clipboard

而且它还是跨平台的(Linux/Windows/macOS),不需要额外的依赖,这是 atotto/clipboard 包的良好替代品。


4

问题

github.com/atotto/clipboard包似乎专门针对文本进行操作,而且它是跨平台的,所以你只能得到文本数据。

在Windows™上,该包使用标准的Win32 API访问剪贴板。特别地,这个语句调用了 GetClipboardData() 并传入了 CF_UNICODETEXT 格式参数,这就是为什么操作成功完成:它返回了剪贴板中包含的文本(在您的情况下是空字符串)。

解决方案

简单的解决方案是复制该包中与Windows有关的代码并修改调用 GetClipboardData 时的参数为 CF_BITMAP

更复杂的解决方案可能是首先执行一系列调用EnumClipboardFormats(),并确定是否有任何图像数据 (CF_BITMAP)可用,然后仅在这种情况下调用 GetClipboardData


谢谢您回答我的问题,但是将 CF_BITMAP 传递给 GetClipboardData 引发了另一个问题,我已经在我的问题中更新了。你能看一下吗? - CSDD
@CSDD,这个问题比我预想的要棘手得多。目前我已经有了一个半成品的解决方案,希望在几个小时内能够完善它。 - kostix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接