扫描仪扫描文件处理之scan_png_monochrome.py

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描仪扫描文件处理之scan_png_monochrome.py相关的知识,希望对你有一定的参考价值。

# -*- coding: utf-8 -*-
# version: python 3
# ==========
# 作用:
# imagemagick处理png为黑白
# ==========
# 扫描
# ABBYY歪斜矫正
# ABBYY另存“PNG彩色”
# “scan_png_monochrome.py”生成“monochrome”目录下黑白png
# 用无损压缩软件(ImageOptim、limitPNG等)压缩“monochrome”目录下的黑白png
# 用Adobe Acrobat DC png转pdf
# ==========
# 当停止脚本后再次运行会删除最后生成的5个文件(按最修改时间排序),已经有的文件跳过。
# ==========
import sys, os

import time

path = ‘/Users/osx/Desktop/test‘  # 处理目录【修改】
suffix = ‘png‘  # "处理目录"中的指定图片后缀【修改】
dpi = 400  # DPI【修改】
paper_width = 210  # 宽度(毫米)【修改】
paper_height = 297  # 高度(毫米)【修改】

out_path = os.path.join(path, ‘monochrome‘)  # 输出目录

# -----毫米转像素-----
# see: http://www.a4papersize.org/a4-paper-size-in-pixels.php (A4 Dimensions @ 600 DPI)
# 公式:毫米 (转英寸) 英寸 (乘以) DPI
width = round(paper_width / float(25.4) * dpi)  # 输出宽度(像素)
height = round(paper_height / float(25.4) * dpi)  # 输出高度(像素)
# -----像素转毫米-----
# 供参考,计算后填入上面的变量:paper_width、paper_height
# 公式:像素 (除以) DPI (英寸转) 毫米
# 例子(A4纸 300DPI):
# 宽度:2480/300*25.4   210mm
# 高度:3508/300*25.4   297mm

brightness = -10  # 亮度(0表示不设置)
contrast = 20  # 对比度(0表示不设置)

print(‘width: %s, height: %s‘ % (width, height))
print(‘----------‘)

# if os.path.exists(out_path):
#     print(‘输出目录已存在,请移走后再运行程序!‘)
#     sys.exit()

if not os.path.exists(out_path):
    os.makedirs(out_path)


def get_file_list(file_list_path, file_list_suffix):
    """得到指定后缀的文件列表"""

    exclude = ([‘.DS_Store‘, ‘.localized‘, ‘Thumbs.db‘, ‘desktop.ini‘])
    result_list = []
    if os.path.isfile(file_list_path):
        result_list.append(os.path.abspath(file_list_path))
    else:
        for dir_path, dir_names, file_names in os.walk(file_list_path):
            if os.path.abspath(dir_path) != os.path.abspath(file_list_path):  # 只允许 1 层目录
                continue
            for name in file_names:
                if (not os.path.basename(name) in exclude)                         and (os.path.splitext(name)[1][1:] == file_list_suffix):  # 指定后缀
                    abs_path = os.path.abspath(os.path.join(dir_path, name))
                    result_list.append(abs_path)
    return result_list


def parse_image(in_image_file, out_image_file):
    """
    黑白图片
    """

    # -----命令行处理图片-----
    resize = ‘ -resize %(width)sx%(height)s‘ % {‘width‘: width, ‘height‘: height}
    gravity = ‘ -gravity center‘
    extent = ‘ -extent %(width)sx%(height)s‘ % {‘width‘: width, ‘height‘: height}

    brightness_contrast = (‘ -brightness-contrast %(brightness)sx%(contrast)s‘
                           % {‘brightness‘: brightness, ‘contrast‘: contrast})

    monochrome = ‘ -monochrome‘

    in_image = ‘ %s‘ % in_image_file
    out_image = ‘ %s‘ % out_image_file
    shell = (‘convert‘
             ‘%(resize)s‘
             ‘%(gravity)s‘
             ‘%(extent)s‘
             ‘%(brightness_contrast)s‘
             ‘%(monochrome)s‘
             ‘%(in_image)s%(out_image)s‘
             % {‘resize‘: resize,
                ‘gravity‘: gravity,
                ‘extent‘: extent,
                ‘brightness_contrast‘: brightness_contrast,
                ‘monochrome‘: monochrome,
                ‘in_image‘: in_image, ‘out_image‘: out_image})  # 覆盖图片

    # print(shell)
    os.system(shell)


def resume():
    """删除最后处理的5个图片(按最修改时间排序)"""

    file_list = get_file_list(out_path, suffix)
    new_file_list = sorted(file_list, key=os.path.getmtime, reverse=True)
    i = 0
    for new_tar in new_file_list:
        if i >= 5:
            break
        print("mtime: %s  delete: %s" % (time.strftime("%Y-%m-%d %H:%M:%S",
                                                       time.localtime(os.path.getmtime(new_tar))
                                                       ), new_tar))
        os.remove(new_tar)
        i += 1


def analyse(in_reverse):
    """打印最大、最小的5个文件"""

    file_list = get_file_list(out_path, suffix)
    new_file_list = sorted(file_list, key=os.path.getsize, reverse=in_reverse)
    i = 0
    for new_tar in new_file_list:
        if i >= 5:
            break
        print("size(Kilobyte): %s" % (round(os.path.getsize(new_tar) / float(1024))))
        i += 1


def main():
    """主方法/main方法"""

    count = 0
    file_list = get_file_list(path, suffix)
    for tar in file_list:
        tar_name = os.path.basename(tar)
        tar_out = os.path.join(out_path, tar_name)
        # 跳过已有文件
        if os.path.exists(tar_out):
            continue

        count += 1
        print(‘%s  %s‘ % (count, tar_name))
        parse_image(tar, tar_out)  # 处理图片

    print(‘----------‘)
    print(‘总共处理了:%s‘ % (count))


print(‘max --> min‘)
analyse(in_reverse=True)
print(‘----------‘)
print(‘min --> max‘)
analyse(in_reverse=False)
print(‘----------‘)
resume()
print(‘----------‘)
main()

  

以上是关于扫描仪扫描文件处理之scan_png_monochrome.py的主要内容,如果未能解决你的问题,请参考以下文章

扫描仪扫描文件处理之切书

扫描仪扫描文件处理之scan_png_monochrome.py

扫描仪扫描文件处理之富士通ix500参数

扫描仪扫描文件处理之imagemagick常用参数

扫描仪扫描文件处理之书签

扫描仪扫描文件处理之imagemagick_resize.py