huiyadanli / PasteEx

:clipboard: Paste As File 把剪贴板的内容直接粘贴为文件
GNU General Public License v3.0
1.34k stars 118 forks source link

带透明通道的PNG图片和GIF动图无法正确保存的问题解决 #5

Closed huiyadanli closed 6 years ago

huiyadanli commented 6 years ago

https://github.com/huiyadanli/PasteEx/issues/2 中提到粘贴文件类型(FileDrop)的功能已经覆盖了这个问题,但仅限于 Firefox 浏览器,Chrome 在将图片写入剪贴版的时候并没有写入文件类型,导致 PNG 图片透明部分变黑,GIF 图像无法变化。

针对 GIF 动图不能动的问题,我查找了相关资料并做了测试,发现剪贴版中 DIB 存储的图片只有 GIF 中的1帧。由此猜测 PNG 图片在剪贴板中也没有保存 Alpha 通道的相关内容(未作验证)

唉,此时只有一种解决方案就是根据剪贴版中 HTML Format 中存储的图片路径直接下载图片。这种方式需要增加进度条,PasteEx 的交互方式需要进行一定变动以保证不给人卡顿的感觉。

顺带一提的是 QQ 复制 GIF 动图会时常卡住。原因就是——它在下载图片,有些时候 GIF 图片很大,下载速度慢就会出现卡住情况。(QQ 在剪贴版中仅存在 HTML Format 类型的数据且内容指向图片的时候会选择下载图片)

参考资料: https://stackoverflow.com/questions/14934327/how-to-get-animated-gif-image-from-browser-clipboard-api

https://stackoverflow.com/questions/19756277/put-gif-image-from-clipboard-to-picturebox

https://msdn.microsoft.com/en-us/library/windows/desktop/ms649013(v=vs.85).aspx

http://tieba.baidu.com/p/1717045885 17L

huiyadanli commented 6 years ago

针对 PNG Alpha 通道丢失的问题(透明像素变黑)

Chrome 在剪贴板中存储了 “CF_DIB”、“CF_DIBV5”、“HTML Format” 三种类型的数据,其中 CF_DIBV5 类型的数据是有存储 Alpha 通道的信息的,只要使用 CF_DIBV5 类型的数据保存图片就可以了!

貌似 CF_DIB 数据类型内也是有 Alpha 通道的信息,这块代码直接照搬 stackoverflow 的回答了,可以完美粘贴透明半透明通道的PNG图片

参考资料: https://stackoverflow.com/questions/998655/how-can-i-get-an-image-out-of-the-clipboard-without-losing-the-alpha-channel-in

https://stackoverflow.com/questions/15689541/win32-clipboard-and-alpha-channel-images

https://stackoverflow.com/questions/14333336/how-can-i-convert-a-cf-dibv5-from-clipboard-format17-to-a-transparent-bitmap