背景
当把电脑的截图上传到网上时,经常因为图片过大(比如大于 10M)导致上传失败。有一个需求是,把截取的图片压缩一下,复制到粘贴板。
第一种解决方法
点击微信里的预览,然后导出,导出时选择 HEIC,质量选最低就行,这样导出的图片可能在 100k 左右。
第二种解决方法是,使用 python 脚本
from PIL import ImageGrab
import pyperclip
from io import BytesIO
# 从剪贴板中获取图片
clipboard_image = pyperclip.paste()
# 将剪贴板中的图片转换为PIL Image对象
image = ImageGrab.grabclipboard()
if image is not None:
# 保存图片为JPEG格式
image.save('/tmp/1.jpg', 'jpeg')
print('图片已保存为 /tmp/')
else:
print('剪贴板中没有图片数据')
只要保存为 jpeg 格式,就能大幅度缩小文件的大小。
第三种解决方法
from PIL import Image
import io
import pasteboard
pb = pasteboard.Pasteboard()
pb_image = pb.get_contents(pasteboard.TIFF)
if pb_image:
image = Image.open(io.BytesIO(pb_image))
if image.mode == 'RGBA':
image.load()
new_image = Image.new('RGB', image.size, (255, 255, 255))
new_image.paste(image, mask=image.split()[3])
image = new_image
data_bytes = io.BytesIO()
image.save(data_bytes, format='JPEG', quality=90)
data_bytes = data_bytes.getvalue()
pb.set_contents(data=data_bytes, type=pasteboard.TIFF)
print('Converted clipboard image to JPG.')
else:
print('No image was copied.')
可以直接把 clipboard 里的图片,从 PNG 转成 JPG(大幅度减小体积)。是从 这里 和 这里 看到的。
实际上,很多人遇到过这个问题,比如 v2ex 这个。
对应的 alfred 已经创建出来了。用 shrink 直接触发。