Help us understand the problem. What is going on with this article?

画像をリサイズするプログラムをexe化して配布したい Python3+pyinstaller

More than 1 year has passed since last update.

企画・概要

  • python3がない環境のPCでpython3のプログラムを動かしたい
  • ソフト使えばええやんとか禁句(書いてみることに意味があるキリッ)
  • pyinstallerを使えばexe化ができるらしい

環境

  • windows10
  • Python 3.5.2 |Anaconda 4.2.0 (64-bit)
  • PyInstaller: 3.2.1

実行

それでは早速やってみよう。
コマンドプロンプトで以下を入力してインストール。

pip install pyinstaller

exe化するプログラム

今回書いたものは画像をリサイズするプログラムだ。
フリーソフトを使えば一瞬でできることをわざわざ書いているので真似する必要はない。
お好きなプログラムでどうぞ。

resize.py
#! python3
# -*- coding: utf-8 -*-
from PIL import Image
import sys


print("画像のリサイズを行います")

try:
    inp_img = str(input("ファイル名を入力:"))
    filename = "picture/" + inp_img + ".jpg"
    img = Image.open(filename, "r")
except FileNotFoundError:
    print("【エラー】ファイルが見つかりません!\n"
          "ファイルはpictureフォルダの中に入れてください")
    exit()

try:
    inp_a = int(input("縦:"))
    inp_b = int(input("横:"))
except ValueError:
    print("【エラー】半角数字を入力してください")
    exit()

resize_img = img.resize((inp_a, inp_b))

# 2017/07/21
# .jpgを削除しないと'pic01.jpg_resize2.jpg'のようになる
filename = filename.replace(".jpg", "")
filename = filename + "_resize2.jpg"

resize_img.save(filename, "JPEG", quality=100, optimize=True)
print("【結果】: " + filename)

thumbnailを使うと綺麗にリサイズできると読んだので試してみたが、指定通りの大きさにリサイズされなかったため断念(コードはおまけ参照)。resize()であれば指定通りのサイズになる。

FileNotFoundErrorはファイルが見つからなかったときのエラー。
ValueErrorは数字以外を入力したときのエラー対策。

qualityの数字を上げることで品質を上げることができる。

画像のリサイズを行います
ファイル名を入力:pic01
縦:100
横:200
【結果】: picture/pic02_resize2.jpg

※pillowが入ってなければ以下のコマンドを実行。

pip install pillow

pyinstallerを使おう

コマンドプロンプトで以下を入力。

pyinstaller.exe resize.py --onefile --clean

(※1)resize.pyの部分にはexe化したいプログラム名を書くこと。
(※2)当然だが指定のプログラムが配置されている階層で行うこと。

/distができたと思うのでその中にあるexeをダブルクリック。
resize.pyでは/dist/pictureが必要なので予め作成して画像を突っ込んでおく必要がある。自動でフォルダを作るとかそんな処理を書いた覚えはない。

ちなみにこのままではエラーが出たときに一瞬で画面が消えてしまってコメントが読めない。そこでもう少し書き換えることにする。

def end():
    while True:
        key = str(input("'e'を入力すると終了します:"))
        try:
            if key == "e":
                sys.exit()
        except ValueError:
            break

前のプログラムのexit()をend()に書き換えればeキーが入力されるまで終了しないようになる。

反省

exe化するプログラムはコマンドプロンプトに依存する形のものではなく、PyQtなどを使ったGUIの方が良いと思った。

おまけ

thumbnailを使ったリサイズプログラム。
適当な大きさにリサイズしたい場合はthumbnailを、指定通りにリサイズしたい場合はresizeを使うのが良いだろう。

from PIL import Image

print("リサイズを行います. jpgのみ対応.")
inp_img = str(input("ファイル名のみ入力してください:"))
filename = "picture/" + inp_img + ".jpg"
img = Image.open(filename, 'r')

a = int(input("縦:"))
b = int(input("横:"))

img.thumbnail((a, b), Image.ANTIALIAS)
img.save(filename+"_resize.jpg", "JPEG", quality=100, optimize=True)

参考資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした