2020年2月25日,在@qq_30683961评论后,我重新测试了一下,发现在现在的QQ和微信中,无需这么复杂,只需一句代码即可复制完成
private void CopyGif(string gifPath)
{
Clipboard.SetText($"<html><body><!--StartFragment--><img src=\"file:///{gifPath}\" /><!--EndFragment--></body></html>",
TextDataFormat.Html);
}
需要注意的是,经过我的测试,只能复制本地硬盘上的gif,无法复制网络上的gif,所以复制网络gif时,需要先将其保存为本地的临时文件
以下是原文:
在C#中操作剪贴板复制图片时,如果是普通图片,可直接将其复制为Bitmap,这样到QQ、微信中粘贴的时候就会直接显示
但是,如果是GIF图片,则粘贴后会发现其无法动,因为将其作为Bitmap复制时,只复制了首帧过去,自然动不了
从网上查找解决办法,因为我是准备在UWP中实现这个,所以一直以UWP为关键字搜索,没有找到任何结果,后来以“C# 复制GIF到QQ”为关键字来搜索,总算搜到了有用的内容
大致的解决办法就是,因为剪贴板本身不支持复制GIF图片,所以要将图片转成html的形式去复制,但是其中有一些参数是需要注意的,StartHTML、EndHTML、StartFragment、EndFragment
下面封装了一个方法,可以将本地的gif复制,在QQ、微信中可直接粘贴
public static string HtmlFormatConstruct(string gifPath)
{
string html = "";
{
var htmlPath = Path.GetTempFileName();
string version = "Version:0.9" + Environment.NewLine;
string startHtml = "StartHTML:";
string endHtml = "EndHTML:";
string startFragment = "StartFragment:";
string endFragment = "EndFragment:";
string sourceUrl = "SourceURL:file:///" + htmlPath + Environment.NewLine;
string htmlContentStart = "<html><body>" + Environment.NewLine;
string fragmentContent = "<!--StartFragment-->" + "<img src=\"file:///" + gifPath + "\" />" +
"<!--EndFragment-->";
string htmlContentEnd = "</body></html>";
startHtml += (version.Length
+ startHtml.Length + 8 + Environment.NewLine.Length
+ endHtml.Length + 8 + Environment.NewLine.Length
+ startFragment.Length + 8 + Environment.NewLine.Length
+ endFragment.Length + 8 + Environment.NewLine.Length
+ sourceUrl.Length).ToString().PadLeft(8, '0') + Environment.NewLine;
endHtml += (version.Length
+ startHtml.Length
+ endHtml.Length + 8 + Environment.NewLine.Length
+ startFragment.Length + 8 + Environment.NewLine.Length
+ endFragment.Length + 8 + Environment.NewLine.Length
+ sourceUrl.Length
+ htmlContentStart.Length
+ fragmentContent.Length
+ htmlContentEnd.Length).ToString().PadLeft(8, '0') + Environment.NewLine;
startFragment += (version.Length
+ startHtml.Length
+ endHtml.Length
+ startFragment.Length + 8 + Environment.NewLine.Length
+ endFragment.Length + 8 + Environment.NewLine.Length
+ sourceUrl.Length
+ htmlContentStart.Length).ToString().PadLeft(8, '0') + Environment.NewLine;
endFragment += (version.Length
+ startHtml.Length
+ endHtml.Length
+ startFragment.Length
+ endFragment.Length + 8 + Environment.NewLine.Length
+ sourceUrl.Length
+ htmlContentStart.Length
+ fragmentContent.Length).ToString().PadLeft(8, '0') + Environment.NewLine;
html = version + startHtml + endHtml + startFragment + endFragment + htmlContentStart +
fragmentContent + htmlContentEnd;
}
return html;
}
将返回值以Html的模式设置到剪贴板即可,按我的理解,QQ和微信会去解析<!--StartFragment-->和<!--EndFragment-->之间的内容并粘贴,如果想要加些水印、尾巴什么的,也可加在这之间