GVKun编程网logo

使用PIL和win32clipboard将图像写入python中的Windows剪贴板吗?

26

本文将为您提供关于使用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剪贴板吗?

使用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将文本复制到剪贴板

c# – 使用asp.net中的Zero Clipboard将文本复制到剪贴板

当客户端点击Button时,我正在尝试使用Zero * Clipboard *将文本从TextBox复制到剪贴板.我正在尝试这个很多天,但没有运气使这项工作.

在场景中,我有一个文本框,它从数据库中呈现数据.我有一个按钮,当客户点击时应该复制文本框的文本.我试过跟随,但它不起作用.

一些帮助将不胜感激.

<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>
            &nbsp;<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 和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(读权限)。"写权限"自动授予脚本,而"读权限"必须用户明确同意给予。也就是说,写入剪贴板,脚本可以自动完成,但是读取剪贴板时,浏览器会弹出一个对话框,询问用户是否同意读取。

image.png

另外,需要注意的是,脚本读取的总是当前页面的剪贴板。这带来的一个问题是,如果把相关的代码粘贴到开发者工具中直接运行,可能会报错,因为这时的当前页面是开发者工具的窗口,而不是网页页面。

(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剪贴板插件的使用

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剪贴板(无需安装软件的方案)

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要

剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPadMac 之间无缝传输剪贴板内容,从而大大提高工作效率。

但是,iPhone 如何和 Windows 剪贴板同步呢?其实方案有很多,有些是通过安装软件来实现,还有一些是通过输入法自带的剪贴板同步功能来实现,例如微信输入法就有剪贴板同步的功能

本文主要讲的是自己去实现一个单向同步,因为我还没实现双向同步,如果后面有方案我会更新本文。

技术原理

iPhone 中有一个叫做 快捷指令 的APP,这个APP提供了一些方法去操作你的 iPhone ,通过里面提供的API可以创建一个自动化脚本,这个脚本就可以获取剪贴板内容,既然能够获取到 iPhone 的剪贴板内容,那么就可以将剪贴板内容通过 快捷指令 的另一个API发送给 Windows 系统,然后在 Windows 系统通过一个 Python 脚本来实时监控 iPhone 的剪贴板更新,获取到新的剪贴板内容则自动设置 Windows 剪贴板。

捷径指令

快捷指令的截图如下:

32087c3a433505858227edf89013490.jpg

创建个人自动化,设定一个触发条件,触发条件是当打开或者关闭某个APP的时候,执行这个自动化脚本。

自动化脚本的顺序是:

  1. 获取剪贴板;
  2. 对剪贴板的内容进行 URL 编码;
  3. 使用文本将局域网的 HTTP接口 和经过 URL编码的剪贴板内容 进行拼接;
  4. 使用 获取URL内容 这个API将剪贴板内容发送给局域网API;
  5. 结束。

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剪贴板(无需安装软件的方案)的相关信息,可以在本站进行搜索。

本文标签: