Pythonが実現する画像圧縮処理ツール

6311 ワード

前言
最近ブログの中で1つのアルバムの机能をして、しかし问题は私のピクチャーがすべてとても大きくて、ピクチャーの圧缩のツールで1回圧缩してとても便利ではありませんて、そこでpythonの関连するツールを探して、それから知っている1篇の文章《どのようにPythonの知能でピクチャーを大量に圧缩します》を発见して、ここは作者が考えを提供したことに感谢して、短い数行のコードはピクチャーの圧缩の需要
最后に画像透かし机能を追加して、画像の経路を简単に配置して圧縮と透かしの追加を実现することができて、もともとTkinterを使って1つの画像のインタフェースの便利な操作を実现するつもりで、后で考えてやはり核心のロジックの上に精力を置くようにしましょう、実はグラフィックのインタフェースを使って见えないのはとても便利で、このように配置を修正するのは実はもっと便利ですグラフィックインタフェースを実現したい場合は、私のもう一つのブログ「Python 2つのケース練習」を参照してください.
インテリジェントポイント
内蔵モジュールとサードパーティモジュール
pythonで、1つ.pyファイルはモジュールとして理解でき、モジュール間で相互参照できます.
モジュールは3つに分けられます.自分で書いたもの、内蔵したもの、第三者のものです.
内蔵モジュールは、通常、インストールディレクトリのlibディレクトリの下に格納され、サードパーティ製ライブラリは、インストールディレクトリのlib\site-packagesディレクトリの下に格納されます.サードパーティ製ライブラリを使用する前に事前にインストールする必要があります.例えば、Pythonが画像を操作するモジュールPILは事前にインストールする必要があります.
2つの導入方法は、例えば、module1を導入し、モジュール方法say()を呼び出す.
#       
import module1
module1.say()
#       
from module1 import *
say()

from...importは、モジュール内のすべてのプロジェクトをインポートする簡単な方法を提供します.しかし、このような声明はあまり使われてはいけない.
PILモジュール
PIL:Python Imaging Libraryは、Pythonプラットフォームの事実上の画像処理標準ライブラリです.PIL機能は非常に強力ですが、APIは非常に簡単で使いやすいです.
インストール:Debian/Ubuntu Linuxの下で直接aptを通じてインストール:$ sudo apt-get install python-imaging WindowsプラットフォームはPIL公式サイトに行ってexeインストールパッケージをダウンロードします.
本稿ではPillowを実装し,PillowはPILに友好的な分岐であり,著者はAlex Clarkと貢献者である.PILはPython画像処理ライブラリであり,著者はFredrik Lundhと貢献者である.
Pillowの中国語ドキュメントについてはこちらを参照してください
globモジュール
globはpythonの内蔵モジュールであり、ファイル操作関連モジュールであり、自分の目的に合ったファイルを検索することができます.
現在の公式最新pythonバージョンは3.7.3で、このバージョンの標準ライブラリドキュメントリンクはここで参照してください.
圧縮実装
以下はPILで実現した画像圧縮関数で、直接修正ディレクトリを貼り付けて使用できます(Pillowのインストールを忘れないでください).
#coding=utf-8
#!/usr/bin/python

from glob import glob
#pip install Pillow
from PIL import Image
import os
import math

SORUCE_DIR = 'D:\\blog\\gitlab\\source\\images\\photo'
TARGET_DIR= 'D:\\blog\\gitlab\\source\\images\\photo\\thumb'
THRESHOLD = 100000  #100kb
NEW_W_H = 800

def resize_images(source_dir, target_dir, threshold, new_w_or_h):
    filenames = glob('{}/*'.format(source_dir))
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    for filename in filenames:
        filesize = os.path.getsize(filename)
        if filesize >= threshold:
            print(filename)
            with Image.open(filename) as im:
                width, height = im.size
                if width >= height:
                    new_width = new_w_or_h
                    new_height = int(new_width * height * 1.0 / width)
                else:
                    new_height = new_w_or_h
                    new_width = int(new_height * width * 1.0 / height)
                resized_im = im.resize((new_width, new_height))
                output_filename = filename.replace(source_dir, target_dir)
                resized_im.save(output_filename)
    

resize_images(SORUCE_DIR, TARGET_DIR, THRESHOLD, NEW_W_H)

ウォーターマークの追加
#       
FONT_FAMILY = 'C:\\Windows\\Fonts\\consola.ttf'

def add_text_to_image(image, text, font_size, font_family=FONT_FAMILY):
    width, height = image.size
    #                
    img_draw = ImageDraw.Draw(image)
    #      
    Font = ImageFont.truetype(font_family, font_size)  
    #      
    textW,textH = Font.getsize(text)   
    #          ,       100/255
    pointX = width - textW - textH / 2
    pointY = height - textH - textH / 2
    img_draw.text([pointX, pointY], text, fill=(255, 255, 255, 100), font = Font)

add_text_to_image(resized_im, "dp2px.com", 30)

完全なコード
#coding=utf-8
#!/usr/bin/python

from glob import glob
#pip install Pillow
from PIL import Image, ImageDraw, ImageFont
import os
import math

#      
SORUCE_DIR = 'D:\\blog\\gitlab\\source\\images\\photo'
#       
TARGET_DIR= 'D:\\blog\\gitlab\\source\\images\\photo\\thumb'
#      
THRESHOLD = 100000  #100kb
#     / 
NEW_W_H = 800
#       0    1  
WAHTER_MARK = 0  

FONT_FAMILY = 'C:\\Windows\\Fonts\\constan.ttf'

def add_text_to_image(image, text, font_size, font_family=FONT_FAMILY):
    width, height = image.size
    #                
    img_draw = ImageDraw.Draw(image)
    #      
    Font = ImageFont.truetype(font_family, font_size)  
    #      
    textW,textH = Font.getsize(text)   
    #                  
    pointX = width - textW - textH / 2
    pointY = height - textH - textH / 2
    img_draw.text([pointX, pointY], text, fill=(255, 255, 255, 100), font = Font)


def resize_images(source_dir, target_dir, threshold, new_w_or_h):
    #         
    filenames = glob('{}/*'.format(source_dir))
    #      
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
    #    
    for filename in filenames:
        filesize = os.path.getsize(filename)
        #    
        if filesize >= threshold:
            with Image.open(filename) as im:
                width, height = im.size
                #      ( / )
                if width >= height:
                    new_width = new_w_or_h
                    new_height = int(new_width * height * 1.0 / width)
                else:
                    new_height = new_w_or_h
                    new_width = int(new_height * width * 1.0 / height)
                resized_im = im.resize((new_width, new_height))
                #        
                if WAHTER_MARK != 0:
                    add_text_to_image(resized_im, "dp2px.com", int(new_w_or_h / 30))
                #       
                output_filename = filename.replace(source_dir, target_dir)
                resized_im.save(output_filename)
    print('      !')

#          
resize_images(SORUCE_DIR, TARGET_DIR, THRESHOLD, NEW_W_H)

くどくど言う
最後に、pythonプログラムを編集して実行するエディタをお勧めします.正確にはプラグインです.
エディタエディタ:Visual Studioカード:Code Runner
このプラグインは現在、ほとんどの言語のコンパイルと実行をサポートしており、非常に使いやすく、インストール後、操作バーには実行中の小さな三角ボタンが1つ増え、クリックして実行すればいい.作者:水寒出典:https://dp2px.com/2019/03/26/python-compress/#more
51 reboot 8.23日(金)『クラウドサービスに基づくDevOpsワークフロー』共有時間:8.23日21:00-22:00
共有内容は以下の通りです:1、背景2、ワークフローエンジン3、使用例4、プレゼンテーション
共有人:アーキテクチャ師のレミーは、現在、ある外資系企業のクラウドサービス業者に就職しています.10年以上のソフトウェア開発とチーム管理経験、豊富なインターネット応用と企業応用アーキテクチャプロジェクト経験.
ここを突き刺す