python 往win10剪貼板塞入文字和圖片(本地圖片、遠程圖片)記錄

導讀

臨時有個需求,需要操作下win10電腦下的剪貼板,我們需要往這個剪貼板中塞入我們的文字信息和圖片資源,當然圖片資源包括本地資源和遠程資源,查閱了一些文檔,發現都比較凌亂,這裏呢,簡單總結下。

1. 需要的幾個包

# 需要載入的模塊包
import win32con
from PIL import Image
import win32clipboard as w
from io import BytesIO
from urllib import request

2. 剪貼板類型

這裏呢,我們往剪貼板塞入內容需要設置的內容的類型,Windows支持不同的預先定義剪切板格式,這些格式在WINDOWS.INC定義成以CF爲前綴的標識符,總共有哪些類型標識符呢,如下展示:

  • CF_TEXT以NULL 結尾的ANSI字符集字符串。它在每行末尾包含一個carriage return和linefeed字符,這是最簡單的剪切板數據格式。傳送到剪切板的數據存放在整體內存塊中,並且是利用內存塊句柄進行傳送的(我將簡短地討論此項概念)。這個內存塊專供剪切板使用,建立它的程序不應該繼續使用它。

  • CF_OEMTEXT 含有文字數據(與CF_TEXT類似)的內存塊。但是它使用的是OEM字符集。通常Windows程序不必關心這一點;它只有與在窗口中執行MS-DOS程序一起使用剪切板時纔會使用。

  • CF_UNICODETEXT 含有Unicode文字的內存塊。與CF_TEXT類似,它在每一行的末尾包含一個carriage return和linefeed字符,以及一個NULL字符(兩個0字節)以表示數據結束。CF_UNICODETEXT只支援Windows NT。

  • CF_LOCALE 一個國家地區標識符的句柄。表示剪切板文字使用的國別地區設定。

下面是兩種附加的剪切板格式,它們在概念上與CF_TEXT格式相似(也就是說,它們都是文字數據),但是它們不需要以NULL結尾,因爲格式已經定義了數據的結尾。現在已經很少使用這些格式了:

  • CF_SYLK包含Microsoft 「符號連結」數據格式的整體內存塊。這種格式用在Microsoft的Multiplan、Chart和Excel程序之間交換數據,它是一種ASCII碼格式,每一行都用carriage return和linefeed結尾。
  • CF_DIF包含數據交換格式(DIF)之數據的整體內存塊。這種格式是由Software Arts公司提出的,用於把數據送到VisiCalc電子表格程序中。這也是一種ASCII碼格式,每一行都使用carriage return和linefeed結尾。

下面三種剪切板格式與位圖有關。所謂位圖就是數據位的矩形數組,其中的數據位與輸出設備的圖素相對應。後面將詳細討論位圖以及這些位圖剪切板的格式:

  • CF_BITMAP與設備相關的位圖格式。位圖是通過位圖句柄傳送給剪切板的。同樣,在把這個位圖傳送給剪切板之後,程序不應該再繼續使用這個位圖。
  • CF_DIB定義一個設備無關位圖的內存塊。這種內存塊是以位圖信息結構開始的,後面跟着可用的顏色表和位圖數據位。
  • CF_PALETTE調色盤句柄。它通常與CF_DIB配合使用,以定義與設備相關的位圖所使用的顏色調色盤。

在剪切板中,還有可能以工業標準的TIFF格式儲存的位圖數據:

  • CF_TIFF含有標號圖像文件格式(TIFF)數據的整體內存塊。這種格式由Microsoft、Aldus公司和Hewlett-Packard公司以及一些硬件廠商推薦使用。這一格式可從Hewlett-Packard的網站上獲得。

下面是兩個metafile格式。一個metafile就是一個以二進制格式儲存的畫圖命令集:

  • CF_METAFILEPICT以舊的metafile格式存放的「圖片」。
  • CF_ENHMETAFILE增強型metafile(32位Windows支持的)句柄。

最後介紹幾個混合型的剪切板格式:

  • CF_PENDATA與Windows的筆式輸入擴充功能聯合使用。
  • CF_WAVE聲音(波形)文件。
  • CF_RIFF使用資源交換文件格式(Resource Interchange File Format)的多媒體數據。
  • CF_HDROP與拖放服務相關的文件列表。

有需要的同學,可以在上面的看列表中,找到合適的標誌符,再傳遞對應的數據內容

方法封裝

下面呢,我封裝了幾個常用的剪切板使用,以及獲取圖片資源(遠程、本地)的方法,方便於後續進行項目的延展性開發

# 讀取本地圖片內容
def getLocalImageData(path):
    img = Image.open(path)
    output = BytesIO()  # BytesIO實現了在內存中讀寫bytes
    img.convert("RGB").save(output, "BMP") #以RGB模式保存圖像
    data = output.getvalue()[14:]
    output.close()
    return data

# 讀取互聯網遠程的圖片內容
def getNetImageData(netUrl):
    file = BytesIO(request.urlopen(netUrl).read())
    img = Image.open(file)
    output = BytesIO()  # BytesIO實現了在內存中讀寫bytes
    img.convert("RGB").save(output, "BMP") #以RGB模式保存圖像
    data = output.getvalue()[14:]
    output.close()
    return data

# 把 Pillow/PIL Image object 塞入剪貼板
def getPILImageData(img):
    output = BytesIO()  # BytesIO實現了在內存中讀寫bytes
    img.convert("RGB").save(output, "BMP") #以RGB模式保存圖像
    data = output.getvalue()[14:]
    output.close()
    return data

# 把圖片內容塞入剪貼板
def setImageDataToClipboard(data):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_DIB, data)
    w.CloseClipboard()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章