# coding: utf-8
# pip install pillow, 用Image模塊操作圖片文件
from PIL import Image
# BytesIO是操作二進制數據的模塊
from io import BytesIO
# pip install pywin32, win32clipboard是操作剪貼板的模塊
import win32clipboard
# 圖片路徑,如果是當前路徑,直接寫文件名
# windows路徑要注意是 \,例:'D:\\t.jpg'
# linux是 /,例: '~/t.jpg'
file_image = 't.jpg'
def send_msg_to_clip(type_data, msg):
"""
操作剪貼板分四步:
1. 打開剪貼板:OpenClipboard()
2. 清空剪貼板,新的數據才好寫進去:EmptyClipboard()
3. 往剪貼板寫入數據:SetClipboardData()
4. 關閉剪貼板:CloseClipboard()
:param type_data: 數據的格式,
unicode字符通常是傳 win32con.CF_UNICODETEXT
:param msg: 要寫入剪貼板的數據
"""
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(type_data, msg)
win32clipboard.CloseClipboard()
def paste_img(file_img):
"""
圖片轉換成二進制字符串,然后以位圖的格式寫入剪貼板
主要思路是用Image模塊打開圖片,
用BytesIO存儲圖片轉換之后的二進制字符串
:param file_img: 圖片的路徑
"""
# 把圖片寫入image變量中
# 用open函數處理后,圖像對象的模式都是 RGB
image = Image.open(file_img)
# 聲明output字節對象
output = BytesIO()
# 用BMP (Bitmap) 格式存儲
# 這里是位圖,然后用output字節對象來存儲
image.save(output, 'BMP')
# BMP圖片有14字節的header,需要額外去除
data = output.getvalue()[14:]
# 關閉
output.close()
# DIB: 設備無關位圖(device-independent bitmap),名如其意
# BMP的圖片有時也會以.DIB和.RLE作擴展名
# 設置好剪貼板的數據格式,再傳入對應格式的數據,才能正確向剪貼板寫入數據
send_msg_to_clip(win32clipboard.CF_DIB, data)
def main():
paste_img(file_image)
if __name__ == '__main__':
main()