自动化图片脚本

为了方便记笔记而写的随时进行屏幕截图并/或去除白底色并上传图片到 OSS 服务的脚本。

最近写笔记的时候遇到需要把纸上手写/屏幕上的内容放到网页上的问题,这个是有一套手动的解决方案的:印象笔记文档扫描,保存同步到电脑,电脑上下载下来,PS 去掉白色背景,上传到 OSS,获取图片链接,插入到笔记上。不过整个过程太过冗杂,让我感到难受,就想办法写个脚本。原本想着全套包揽,但之后发现摄像头文档扫描和手机电脑文件同步这两点实在是不好做,就还是用印象笔记了。所以脚本做的事情是:可以截图,给文档图片去除白色背景(透明色,可选功能),上传到 OSS,把链接地址复制到剪贴板。

屏幕截图

主要使用了 github 上一个现成的 python 库,用 pyQt5 写成,轻量级,好用。在源码的基础上修改了一下就能用了。

https://github.com/SeptemberHX/screenshot

OSS API

先想办法以编程的方式上传到阿里云的 OSS,翻了半天他们的 API 官方文档,后来发现有现成的 Python SDK,何乐而不为:)

pip install oss2

就可以安装了。使用起来也很方便,用权限 ID 与密钥、终端名称等初始化,之后直接上传一个文件对象就行。专门给自动上传脚本设了文件前缀。不过本来就是拿来做图床的 OSS 结构也挺乱的。

上传完成之后用 python 的跨平台剪贴板包pyperclip来把地址复制到剪贴板

import pyperclip

pyperclip.copy(address)

这样基础结构就完成了。

去除图片白底色

还有比较麻烦的一点是背景透明化,因为白色背景的图片放到别的颜色的网页上会很丑。印象笔记扫描模式出来的照片背景基本都是很白的,之前直接在 PS 里面选中颜色(容差也不大)删除就行。这一步还是可以编程实现的。

Python 的图片处理库:PIL(Python Image Library)。步骤:读入文件、转换为 RGBA 模式、遍历像素,如果是白色就把 Alpha 通道设为 0、保存。代码:

from PIL import Image

im = Image.open(filename).convert('RGBA')
pix = im.load()
for y in range(im.size[1]):
    for x in range(im.size[0]):
        if pix[x,y][0] > 220 and pix[x,y][2] > 220 and pix[x,y][3] > 220:
            pix[x,y] = (255,255,255,0)
filename = os.path.splitext(filename)[0] + '_rmbg.png'
im.save(filename, 'PNG')

配置 Path

这样基本就完成了。为了让脚本能在任何路径下访问到,新建了路径 D:\scripts\,并把它加入到系统 Path 中,这样里面的脚本就可以直接执行了。目录下 python 文件和 bat 脚本,通过执行 bat 来调用 python 脚本。ossup.bat:

python D:\scripts\oss.py %1 %2

大功告成。

最后附上完整 python 文件:

import os, sys, pyperclip
import oss2
from PIL import Image

if len(sys.argv) < 2:
    print('No enough arguments!')
    exit()

filename = os.path.basename(sys.argv[1])

if not os.path.exists(filename):
    print('File not exists : ' + filename)
    exit()

if 'bg' in sys.argv:
    print('Processing background...')
    im = Image.open(filename).convert('RGBA')
    pix = im.load()
    for y in range(im.size[1]):
        for x in range(im.size[0]):
            if pix[x,y][0] > 220 and pix[x,y][2] > 220 and pix[x,y][3] > 220:
                pix[x,y] = (255,255,255,0)
    filename = os.path.splitext(filename)[0] + '_rmbg.png'
    im.save(filename, 'PNG')

print('Initializing oss sdk...')

access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '<>')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '<>')
bucket_name = os.getenv('OSS_TEST_BUCKET', '<>')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '<>')

bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)

oss_name = 'autoup/' + filename

print('Filename : ' + oss_name + '\nUploading')

with open(filename, 'rb') as f:
    bucket.put_object(oss_name, f)

if 'bg' in sys.argv:
    os.remove(filename)

address = '<>' + oss_name
pyperclip.copy(address)

print('Address copied to clipboard!\nBye~')