OuYang-WS

基于python+OpenCV的简易图片负片化脚本

引出&这个脚本的用处

最近发现电脑使用暗色系主题时能挺大程度上缓解用眼疲劳的,因此就给平时最常用的markdown编辑器换了个暗色主题
不过对于文字内容来说更换配色很简单,但是图片就比较麻烦了,更改颜色不方便
Untitled
黑底白字的界面上强塞入这么大一个白色图片,简直逼死强迫症啊!

因此打算写一个小脚本,来实现把源图片拖拽到某个处理程序上就能自动转换为黑色系。

不过针对特定颜色进行更改好像有点麻烦而且效果不是很好。比如识别某个像素的RGB值在白色区间内时,就全部改为(0,0,0)?使用这种暴力阈值法处理低分辨率图片的图像轮廓边缘会很糟糕。

因此不如使用“负片”的效果,只是对颜色进行更改,不会丢失信息。

实现

由于python脚本在windows中本身不支持“把文件拖拽到脚本上作为执行参数”,但是bat脚本是支持的,因此可以把待处理图片拖拽到bat脚本上来读取图片路径,然后再bat脚本再调用python脚本,并把刚才的图片路径作为python脚本的执行参数,达到“间接拖拽”的效果

将文件拖拽到我上以处理为负片.bat

:: 写上这条指令,不然执行bat时会把下列的每条指令都打在公屏上
@echo off
:: %*代表的是拖拽到bat脚本上的所有文件的集合,最好把这个值保存在变量里,不然待会调用函数的时候再使用%*好像值就不一样了?
set dragged_items=%*
:: %0代表的是该文件本身所在的地址,如C:\Users\CSD\Documents\Enote_database\__batch_processor__\将图片啥啥啥.bat
set LocalPath=%0
:: 这是在调用下面那个execute_python_script函数,参数就为刚才设置的LocalPath
call :execute_python_script %LocalPath%
:: 显示一行“按下任意按钮以继续...”
:: pause


:execute_python_script
:: 下面的等号后边写同级目录中那个python脚本的名称
set python_script=invertPICS.py
:: 这是把刚才批处理脚本自身的 文件地址 中的自身名称(将图片啥啥啥.bat)给删掉了,剩下一个路径,然后把python脚本的路径跟它的路径拼接起来,就变成python脚本的路径了
:: (当然前提肯定就是你得把python脚本和bat脚本放在一个目录下啦=_=)
set file_path=%~dp1%python_script%
:: 最后,终于可以执行python脚本了,参数就是刚才拖拽到bat上的那些文件
python %file_path% %dragged_items%

invertPICS.py

import sys
import cv2 as cv

pic_extensions = [".png", ".jpg"]

file_paths = sys.argv[1:]
print(file_paths)
for Pic in file_paths:
    for pic_extension in pic_extensions:
        if str(Pic).endswith(pic_extension):
            Pic_data = cv.imread(Pic, 1)
            # cv.imshow("preview", Pic_data)
            # cv.waitKey(3000)
            try:
                test = Pic_data.shape[0]
                Pic_data = 255 - Pic_data
                cv.imwrite(Pic, Pic_data)
            except AttributeError: # OpenCV的imread不支持中文路径
                print(">>Error! you'd gotta use a pure English filename!")
            break

posted on 2022-06-08 01:12  megaobanana  阅读(245)  评论(0编辑  收藏  举报