|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2023/11/24 15:19:31 |
标题: |
大佬们,有没有办法把图片和文字一起放进剪切板 |
浏览:1033 |
|
加入我的收藏 |
楼主: |
如题 ,用Clipboard实现单文字或者图片都很容易,但是如果要放在一起该如何做?
----------------------------------------------
-QQ:1379585 |
作者: |
lsuper (lsuper) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2023/11/24 15:41:50 |
1楼: |
走标准的 html 或 rtf 格式;或者自定义
----------------------------------------------
-
|
作者: |
|
2023/11/24 15:47:47 |
2楼: |
居然引来了大神回贴,十万分感谢!!! 用web控件把图片和文字写到里面,然后全选,调用windows功能键Ctrl+C,是这个思路吗?
----------------------------------------------
-QQ:1379585
|
作者: |
|
2023/11/24 17:03:24 |
3楼: |
使用 HTML 有两种方法:
1. 内容其实对应的是一个 http 的地址。剪贴地址。
2. 把文字和图片,打包到一个 HTML 文件里面。也就是说,HTML 文件里面包含图片数据,而不是简单的图片链接。这个图片数据如果是 MIME 编码的,那也就是一堆 ASCII 字符了。当然,接收方如果能处理 HTML 比如是一个浏览器,也无需考虑如何去解码图片,直接就能显示出来。
----------------------------------------------
-
|
作者: |
|
2023/11/25 9:24:18 |
4楼: |
主要用途是粘贴到微信或者foxmail等邮件客户端
----------------------------------------------
-QQ:1379585
|
作者: |
|
2023/11/26 0:43:35 |
5楼: |
邮件客户端都支持 HTML 的。
邮件的内容本身就是图片文字混合在一起的。这个 Indy 都支持的。你直接使用 Indy 的控件就能完成。
----------------------------------------------
-
|
作者: |
|
2023/11/28 11:29:57 |
6楼: |
我周末尝试用delphi自带的WebBrowser,没弄好,后面又百度了一下,试着把图片转成base64,也没成功。我再慢慢试吧,至少有方同了,感谢楼上的大大们。
----------------------------------------------
-QQ:1379585
|
作者: |
|
2023/11/28 13:20:07 |
7楼: |
这是很多年前做的一个剪切板html格式的,用来复制了图片的,可以参考下。找了很久才找到哈,都忘了扔哪里的
FCF_HTML := RegisterClipboardFormat('HTML Format');
procedure TClipboardEx.SetClipboardHTML(ASrcFileName: string; ABmpStream: TStream); var Bmp: TBitmap; begin Bmp := TBitmap.Create; try ABmpStream.Position := 0; Bmp.LoadFromStream(ABmpStream); SetClipboardHTML(ASrcFileName, Bmp); finally Bmp.Free; end; end;
procedure TClipboardEx.SetClipboardHTML(ASrcFileName: string; ABitmap: TBitmap); var LSrcURL: string; begin if ABitmap <> nil then begin LSrcURL := 'file :///' + ASrcFileName.Replace('\', '/'); Clear; SetClipboardBitmap(ABitmap); SetClipboardHTML(LSrcURL, ABitmap.Width, ABitmap.Height, False); SetBuffer(CF_UNICODETEXT, PChar(LSrcURL)^, ByteLength(LSrcURL) + SizeOf(Char)); SetClipboardFile(ASrcFileName); end; end;
procedure TClipboardEx.SetClipboardHTML(ASourceURL: string; AWidth, AHeight: Integer; AClear: Boolean = True); var LUTF8Buffer, LSourceURLUTF8: UTF8String; LImgLabel: UTF8String; LSrcLen: Integer; sss: string; begin if AClear then Clear; LSourceURLUTF8 := UTF8String(StringOf(TEncoding.Convert(TEncoding.Default, TEncoding.UTF8, BytesOf(ASourceURL)))); LSrcLen := Length(LSourceURLUTF8);
LImgLabel := Format('<IMG width="%d" height="%d" src="%s">', [AWidth, AHeight, ASourceURL]);
// 格式CF_HTML格式说明 // https://learn.microsoft.com/zh-cn/windows/win32/dataxchg/html-clipboard-format LUTF8Buffer := Format( 'Version:1.0'#13#10 + 'StartHTML:%.8d'#13#10 + 'EndHTML:%.8d'#13#10 + 'StartFragment:%.8d'#13#10 + 'EndFragment:%.8d'#13#10 + 'StartSelection:%.8d'#13#10 + 'EndSelection:%.8d'#13#10 + 'SourceURL:%s'#13#10 + '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'#13#10 + '<HTML><HEAD></HEAD>'#13#10 + '<BODY><!--StartFragment-->%s<!--EndFragment--></BODY></HTML>', [ 155 + 1 + LSrcLen, // StartHTML 300 + LSrcLen + Length(LImgLabel), // EndHTML 248 + LSrcLen + 20, // StartFragment 268 + LSrcLen + Length(LImgLabel), // EndFragment 248 + LSrcLen + 20, // StartSelection 268 + LSrcLen + Length(LImgLabel), // EndSelection LSourceURLUTF8, // SourceURL LImgLabel]);
OutputDebugString(PChar(sss)); { LHTMLBuffer := Format( 'Version:0.9'#13#10 + 'StartHTML:%.8d'#13#10 + 'EndHTML:%.8d'#13#10 + 'StartFragment:%.8d'#13#10 + 'EndFragment:%.8d'#13#10 + '<html><body>'#13#10 + '<!--StartFragment -->'#13#10 + '%s'#13#10 + '<!--EndFragment-->'#13#10 + '</body></html>', [97, 172 + Length(LUTF8Buffer), 111, 136 + Length(LUTF8Buffer), LUTF8Buffer]); }
SetBuffer(FCF_HTML, PUTF8String(LUTF8Buffer)^, Length(LUTF8Buffer) + 1); end;
----------------------------------------------
一个热爱delphi的人,Golang GUI库。 --我的博客--
|
作者: |
|
2023/11/28 16:54:08 |
8楼: |
还有人在写邮件客户端吗?做外贸软件的吧。
----------------------------------------------
欢迎加入OrangeUI的app开发阵营:http://www.orangeui.cn/,联系QQ452330643
|
作者: |
|
2023/11/29 21:56:41 |
9楼: |
在 HTML 中把图片用 Base64 编码插入,翻了一下我的代码:
function TForm1.GetFileBase64(var FileType: string): string; var StrStream: TStringStream; FileStream: TFileStream; begin {---------- 关于 Delphi 官方的编码函数编码完后有回车换行符 Result := EncodeBase64(MemoryStream.Memory, MemoryStream.Size); //base64默认有一个77字符后换行一次,用TCP发送时不方便,就去掉了回车换行。 Result := StringReplace(Result, #13, '', [rfReplaceAll]); Result := StringReplace(Result, #10, '', [rfReplaceAll]);
//TNetEncoding.Base64.Encode(FileStream, StrStream); // TNetEncoding 编码的结果,在中间加了很多回车换行符号,作为图片数据,浏览器无法显示。 ----------} Result := ''; if OpenDialog1.Execute then begin FileType := TPath.GetExtension(OpenDialog1.FileName); FileType := FileType.Remove(1, 1); //去掉前面的点 FileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); StrStream := TStringStream.Create; try FileStream.Position := 0; IdEncoderMIME1.Encode(FileStream, StrStream); //IdEncodeMiMe 编码的数据,浏览器能够正常显示。 Result := StrStream.DataString; finally FileStream.Free; StrStream.Free; end; end; end;
以下是插入代码,其实这里是用 JS 来实现的:
procedure TForm1.AcAddPicExecute(Sender: TObject); var S, FileType: string; i: Integer; begin //插入本地图片,成功。 S := Self.GetFileBase64(FileType); S := 'data:image/' + FileType + ';base64,' + S;
S := 'document.execCommand("InsertImage", false, '+ QuotedStr(S) + ')';
EdgeBrowser1.ExecuteScript(S); end;
----------------------------------------------
-
|
作者: |
|
2023/11/29 22:00:42 |
10楼: |
如果你不想用 WebBrowser 来做,可以直接采用字符串操作的方式把图片的 Base64 编码写入 HTML 文本里面。
具体的 HTML 的语法格式,你可以上网查一下,我以前做过,不过细节不记得了。
----------------------------------------------
-
|
作者: |
|
2023/11/30 0:50:21 |
11楼: |
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
呆湾傻冒
|
作者: |
|
2023/11/30 14:25:32 |
12楼: |
感谢各位前辈,周末我会逐一测试,不过本人水平很有限,如有不懂的地方再来请教,再次感谢!
----------------------------------------------
-QQ:1379585
|
|