一些背景信息:我正在编写一个笔记应用,其中一个最受请求的功能是能够将剪贴板中复制的图像直接粘贴到笔记中。
我想尽可能完美地实现这个功能,但据我所知,Electron提供的当前相关API有一些限制,无法很好地实现这个功能。
问题1 - 不存在的图像
即使剪贴板中没有图像,clipboard.readImage
仍然返回一个NativeImage
示例。
我不知道为什么当剪贴板中没有图像时,有人会想要返回这些无用的图像,但更重要的是,这种行为似乎在文档中没有记录,文档中提到这个函数返回“剪贴板中的图像内容”。
我认为当剪贴板中没有图像时,这个方法应该返回null
或undefined
。如果出于某种原因无法更改,那么文档中应该提到,如果在剪贴板中没有找到实际的图像,将返回0x0图像。
问题2 - 意外的转换
NativeImage
对象有很多.toFORMAT
方法,但只有一个toDataURL
方法,而且文档说toDataURL
返回“图像的数据URL”,所以考虑到任何图像都可以用数据URL编码,我原本以为特定格式的图像会保留特定的数据URL格式,例如,GIF的数据URL应该以data:image/gif
开头,但根据这个方法,实际上这个函数是将图像转换为PNG,而不管它们的原始格式是什么。因此,对于任何GIF,返回的数据URL都不是编码该图像的实际数据URL,而是将该图像转换为PNG的可能数据URL,这并不是我所期望的。
问题3 - 保留原始数据
应该能够检索剪贴板中编码图像的原始缓冲区,以免丢失任何信息或以任何方式更改图像。
最引人注目的是,没有方法可以检索复制的图像作为GIF或SVG,这从根本上使动画GIF或矢量图像无法以任何合理的方式复制。
提供的方法用于转换为PNG和JPG也存在问题,我不想将用户在剪贴板中复制的PNG图像转换为JPG或反之,以免引入任何伪影,并总的来说不想改变复制的图像。此外,toJPEG
方法要求我提供质量因子,我只想要原始质量的图像,这在今天似乎不可能。
TL;DR:我真的希望有一个函数,只要返回剪贴板中复制的图像的扩展名、MIME类型和缓冲区,不作任何更改。
3条答案
按热度按时间gmol16391#
@fabiospampinato 对于SVGs - 使用fs读取文件是否不起作用?将其复制为文本,然后将其作为文本读取并写回svg文件?
huwehgph2#
@codebytere 当我打开这个问题时,我不知道有人能做到这一点,这种方法确实有效,但是:
require ( 'electron' ).clipboard.read ( 'NSFilenamesPboardType' )
会崩溃应用程序,这一点都不好。c9qzyr3d3#
@fabiospampinato 我找到了一种处理SVG的方法,我可以尝试添加它!