本文将为您提供关于使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?的详细介绍,同时,我们还将为您提供关于c#–使用asp.net中的ZeroClipboard
本文将为您提供关于使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?的详细介绍,同时,我们还将为您提供关于c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板、Clipboard 和clipboardData操作剪贴板数据、input元素占位,但是不显示 及 Clipboard.js剪贴板插件的使用、iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)的实用信息。
本文目录一览:- 使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?
- c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板
- Clipboard 和clipboardData操作剪贴板数据
- input元素占位,但是不显示 及 Clipboard.js剪贴板插件的使用
- iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)
使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?
我正在尝试打开图像文件并将图像复制到Windows剪贴板。有没有办法来解决这个问题:
import win32clipboardfrom PIL import Imagedef send_to_clipboard(clip_type, data): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardData(clip_type, data) win32clipboard.CloseClipboard()clip_type = win32clipboard.CF_BITMAPfilepath = ''c:\\temp\\image.jpg''im = Image.open(filepath) data = im.tobitmap() # fails with valueerror: not a bitmap# data = im.tostring() runs, but receiving programs can''t read the resultssend_to_clipboard(clip_type, data)
我可以安装PythonMagick等,但宁愿不为一次性程序安装另一个库
答案1
小编典典from cStringIO import StringIOimport win32clipboardfrom PIL import Imagedef send_to_clipboard(clip_type, data): win32clipboard.OpenClipboard() win32clipboard.EmptyClipboard() win32clipboard.SetClipboardData(clip_type, data) win32clipboard.CloseClipboard()filepath = ''image.jpg''image = Image.open(filepath)output = StringIO()image.convert("RGB").save(output, "BMP")data = output.getvalue()[14:]output.close()send_to_clipboard(win32clipboard.CF_DIB, data)
c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板
在场景中,我有一个文本框,它从数据库中呈现数据.我有一个按钮,当客户点击时应该复制文本框的文本.我试过跟随,但它不起作用.
一些帮助将不胜感激.
<script type="text/javascript" src="/Scripts/ZeroClipboard.js"></script> <script type="text/javascript"> ZeroClipboard.setMoviePath('/Scripts/ZeroClipboard.swf'); </script> <script> function test() { ZeroClipboard.setMoviePath('/Scripts/ZeroClipboard.swf'); //create client var clip = new ZeroClipboard.Client(); //event clip.addEventListener('mousedown',function () { clip.setText(document.getElementById('TextBox2').value); }); clip.addEventListener('complete',function (client,text) { alert('copied: ' + text); }); //glue it to the button clip.glue('d_clip_button'); } </script> <asp:TextBox ID="TextBox2" runat="server" BorderEnabled="False" Font-Size="Medium" ForeColor="Black" Width="213px"></asp:TextBox> <asp:Button ID="d_clip_button" runat="server" Text="copy" OnClientClick="javascript:test();" />
解决方法
<html> <body> <button id="copy-button" data-clipboard-text="copy Me!" title="Click to copy me."> copy to Clipboard</button> <script src="ZeroClipboard.js"></script> <script src="main.js"></script> </body> </html> //In Main.js file // main.js var clip = new ZeroClipboard( document.getElementById("copy-button"),{ moviePath: "/path/to/ZeroClipboard.swf" } ); clip.on( 'load',function(client) { // alert( "movie is loaded" ); } ); clip.on( 'complete',function(client,args) { this.style.display = 'none'; // "this" is the element that was clicked alert("copied text to clipboard: " + args.text ); } ); clip.on( 'mouSEOver',function(client) { // alert("mouse over"); } ); clip.on( 'mouSEOut',function(client) { // alert("mouse out"); } ); clip.on( 'mousedown',function(client) { // alert("mouse down"); } ); clip.on( 'mouseup',function(client) { // alert("mouse up"); } );
Clipboard 和clipboardData操作剪贴板数据
异步 Clipboard API
Clipboard API 是下一代的剪贴板操作方法
它的所有操作都是异步的,返回 Promise 对象,不会造成页面卡顿。而且,它可以将任意内容(比如图片)放入剪贴板。
navigator.clipboard属性返回 Clipboard 对象,所有操作都通过这个对象进行。
const clipboardObj = navigator.clipboard;
如果navigator.clipboard属性返回undefined,就说明当前浏览器不支持这个 API。
由于用户可能把敏感数据(比如密码)放在剪贴板,允许脚本任意读取会产生安全风险,所以这个 API 的安全限制比较多。
首先,Chrome 浏览器规定,只有 HTTPS 协议的页面才能使用这个 API。不过,开发环境(localhost)允许使用非加密协议。
其次,调用时需要明确获得用户的许可。权限的具体实现使用了 Permissions API,跟剪贴板相关的有两个权限:clipboard-write(写权限)和clipboard-read(读权限)。"写权限"自动授予脚本,而"读权限"必须用户明确同意给予。也就是说,写入剪贴板,脚本可以自动完成,但是读取剪贴板时,浏览器会弹出一个对话框,询问用户是否同意读取。
另外,需要注意的是,脚本读取的总是当前页面的剪贴板。这带来的一个问题是,如果把相关的代码粘贴到开发者工具中直接运行,可能会报错,因为这时的当前页面是开发者工具的窗口,而不是网页页面。
(async () => {
const text = await navigator.clipboard.readText();
console.log(text);
})();
如果你把上面的代码,粘贴到开发者工具里面运行,就会报错。因为代码运行的时候,开发者工具窗口是当前页,这个页面不存在 Clipboard API 依赖的 DOM 接口。一个解决方法就是,相关代码放到setTimeout()里面延迟运行,在调用函数之前快速点击浏览器的页面窗口,将其变成当前页。
setTimeout(async () => {
const text = await navigator.clipboard.readText();
console.log(text);
}, 2000);
上面代码粘贴到开发者工具运行后,快速点击一下网页的页面窗口,使其变为当前页,这样就不会报错了
Clipboard对象
Clipboard 对象提供了四个方法,用来读写剪贴板。它们都是异步方法,返回 Promise 对象。、
Clipboard.readText()
Clipboard.readText()方法用于复制剪贴板里面的文本数据。
document.body.addEventListener(
''click'',
async (e) => {
const text = await navigator.clipboard.readText();
console.log(text);
}
)
如果是第一次调用浏览器这时会跳出一个对话框,询问用户是否同意脚本读取剪贴板。
如果用户不同意,脚本就会报错这时,可以使用try...catch结构,处理报错。
async function getClipboardContents() {
try {
const text = await navigator.clipboard.readText();
console.log(''Pasted content: '', text);
} catch (err) {
console.error(''Failed to read clipboard contents: '', err);
}
}
Clipboard.read()
Clipboard.read()方法用于复制剪贴板里面的数据,可以是文本数据,也可以是二进制数据(比如图片)。该方法需要用户明确给予许可。
该方法返回一个 Promise 对象。一旦该对象的状态变为 resolved,就可以获得一个数组,每个数组成员都是 ClipboardItem 对象的实例。
async function getClipboardContents() {
try {
const clipboardItems = await navigator.clipboard.read();
for (const clipboardItem of clipboardItems) {
for (const type of clipboardItem.types) {
const blob = await clipboardItem.getType(type);
console.log(URL.createObjectURL(blob));
}
}
} catch (err) {
console.error(err.name, err.message);
}
}
ClipboardItem 对象表示一个单独的剪贴项,每个剪贴项都拥有ClipboardItem.types属性和ClipboardItem.getType()方法。
ClipboardItem.types属性返回一个数组,里面的成员是该剪贴项可用的 MIME 类型,比如某个剪贴项可以用 HTML 格式粘贴,也可以用纯文本格式粘贴,那么它就有两个 MIME 类型(text/html和text/plain)。
ClipboardItem.getType(type)方法用于读取剪贴项的数据,返回一个 Promise 对象。该方法接受剪贴项的 MIME 类型作为参数,返回该类型的数据(Bolb对象),该参数是必需的,否则会报错。
Clipboard.writeText()
Clipboard.writeText()方法用于将文本内容写入剪贴板。
document.body.addEventListener(
''click'',
async (e) => {
await navigator.clipboard.writeText(''Yo'')
}
)
上面示例是用户在网页点击后,脚本向剪贴板写入文本数据。
该方法不需要用户许可,但是最好也放在try...catch里面防止报错。
async function copyPageUrl() {
try {
await navigator.clipboard.writeText(location.href);
console.log(''Page URL copied to clipboard'');
} catch (err) {
console.error(''Failed to copy: '', err);
}
}
Clipboard.write()
Clipboard.write()方法用于将任意数据写入剪贴板,可以是文本数据,也可以是二进制数据。
该方法接受一个 ClipboardItem 实例作为参数,表示写入剪贴板的数据。
try {
const imgURL = ''https://dummyimage.com/300.png'';
const data = await fetch(imgURL);
const blob = await data.blob();
await navigator.clipboard.write([
new ClipboardItem({
[blob.type]: blob
})
]);
console.log(''Image copied.'');
} catch (err) {
console.error(err.name, err.message);
}
上面示例中,脚本向剪贴板写入了一张图片。注意,Chrome 浏览器目前只支持写入 PNG 格式的图片。传入的数组也只能有一个ClipboardItem,传入多个ClipboardItem会报错
ClipboardItem()是浏览器原生提供的构造函数,用来生成ClipboardItem实例,它接受一个对象作为参数,该对象的键名是数据的 MIME 类型,键值就是数据本身,键值必须是Bolb对象。
下面的例子是将同一个剪贴项的多种格式的值,写入剪贴板,一种是文本数据,另一种是二进制数据,供不同的场合粘贴使用。
function copy() {
const image = await fetch(''kitten.png'');
const text = new Blob([''Cute sleeping kitten''], {type: ''text/plain''});
const item = new ClipboardItem({
''text/plain'': text,
''image/png'': image
});
await navigator.clipboard.write([item]);
}
Event.clipboardData
const source = document.querySelector(''.source'');
source.addEventListener(''copy'', (event) => {
const selection = document.getSelection();
event.clipboardData.setData(''text/plain'', selection.toString().toUpperCase());
event.preventDefault();
});
copy,cut事件对象中的clipboardData没有任何剪贴项数据,也只能调用setData(''text/plain'')来增加文本剪贴项,暂时无法添加其它类型的
paste中clipboardData只能调用getData,无法调用setData
注意点
1、目前大多数浏览器剪贴板中只支持一个剪贴项,setData,writeText和write以及copy、cut行为都会添加剪贴项,后面添加的会顶掉前面的。
input元素占位,但是不显示 及 Clipboard.js剪贴板插件的使用
opacity:0;
visibility:hidden;
这两个效果都是让元素不显示,但存在/占位,意思是让元素不可见,但会占据页面上的空间
Clipboard.js使用
html&js
<inputid="copyVal" value="" />//存放要复制内容的元素
<a lay-event="tui_guang_coupon"data-clipboard-action="copy" data-clipboard-target="#copyVal" >推广</a>//点击触发按钮
//推广优惠券信息
function tuiGuangCouponInfo(coupon_id)
{
var url = "http://"+window.location.host+"/index.php/admin/marketing.coupon/tuiGuang.html?id="+coupon_id;
$("#copyVal").val(url);//更改了要复制的内容
}
//实例化 ClipboardJS对象;
var copyBtn = new ClipboardJS(''.copyBtn'');
copyBtn.on("success",function(e){
// 复制成功
alert("复制成功");
e.clearSelection();
});
copyBtn.on("error",function(e){
//复制失败;
alert("复制失败");
console.log( e.action )
});
iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)
摘要
剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v
粘贴,这方面在 Apple
设备中是做的非常好的,Apple
设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad
和 Mac
之间无缝传输剪贴板内容,从而大大提高工作效率。
但是,iPhone
如何和 Windows
剪贴板同步呢?其实方案有很多,有些是通过安装软件来实现,还有一些是通过输入法自带的剪贴板同步功能来实现,例如微信输入法就有剪贴板同步的功能。
本文主要讲的是自己去实现一个单向同步,因为我还没实现双向同步,如果后面有方案我会更新本文。
技术原理
在 iPhone
中有一个叫做 快捷指令
的APP,这个APP提供了一些方法去操作你的 iPhone
,通过里面提供的API可以创建一个自动化脚本,这个脚本就可以获取剪贴板内容,既然能够获取到 iPhone
的剪贴板内容,那么就可以将剪贴板内容通过 快捷指令
的另一个API发送给 Windows
系统,然后在 Windows
系统通过一个 Python
脚本来实时监控 iPhone
的剪贴板更新,获取到新的剪贴板内容则自动设置 Windows
剪贴板。
捷径指令
快捷指令的截图如下:
创建个人自动化,设定一个触发条件,触发条件是当打开或者关闭某个APP的时候,执行这个自动化脚本。
自动化脚本的顺序是:
- 获取剪贴板;
- 对剪贴板的内容进行
URL
编码; - 使用文本将局域网的
HTTP接口
和经过URL编码的剪贴板内容
进行拼接; - 使用
获取URL内容
这个API将剪贴板内容发送给局域网API; - 结束。
Windows Python脚本
在本地开启一个 php
服务器,通过一个简单的 php
脚本来保存剪贴板的内容。
<?php
$content = $_GET[''content''];
file_put_contents(''./content.txt'', $content);
echo ''<h1>OK</h1>'';
例如在本地服务器 clipboard
目录下创建 index.php
将上面代码复制进去。
快捷指令发送数据过来的时候,就会将剪贴板内容保存在 content.txt
里面。
然后本地开启 Python
脚本去循环读取这个 content.txt
是否有新内容,如果有则设置到剪贴板。
clipboard.py
import requests
import time
import pyperclip
import tkinter as tk
from tkinter import messagebox
def fetch_content(url):
try:
response = requests.get(url)
response.raise_for_status()
response.encoding = ''utf-8''
return response.text
except requests.RequestException as e:
print(f"Error fetching content: {e}")
return None
def show_floating_notification(message):
# 创建一个透明窗口靠近鼠标指针
root = tk.Tk()
root.overrideredirect(True) # 去掉窗口边框
root.attributes("-topmost", True) # 窗口置顶
root.attributes("-alpha", 0.8) # 设置透明度
root.geometry(f"220x30+{root.winfo_pointerx()}+{root.winfo_pointery()}") # 设置窗口大小和位置
label = tk.Label(root, text=message, bg="#eee", fg="#666", font=("Arial", 11))
label.pack(expand=True, fill=''both'')
# 自动关闭窗口
root.after(2000, root.destroy) # 3秒后自动关闭窗口
root.mainloop()
def monitor_content(url, interval=1):
last_content = None
while True:
current_content = fetch_content(url)
if current_content is not None and current_content != last_content:
print("New content detected:")
print(current_content)
pyperclip.copy(current_content) # 将内容复制到剪贴板
print("Content has been copied to the clipboard.")
show_floating_notification("来自iPhone13的剪贴板内容")
last_content = current_content
time.sleep(interval) # 间隔指定的秒数再检查
if __name__ == "__main__":
url = "http://192.168.2.112/clipboard/content.txt"
monitor_content(url)
其它说明
本方案仅为初次实验和研究是可行的,可进行深度优化,会变得更好用。
作者
TANKING
我们今天的关于使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?的分享就到这里,谢谢您的阅读,如果想了解更多关于c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板、Clipboard 和clipboardData操作剪贴板数据、input元素占位,但是不显示 及 Clipboard.js剪贴板插件的使用、iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)的相关信息,可以在本站进行搜索。
本文标签: