# -*- coding: utf-8 -*-
"""
スクリプト名 : tkinterpiccolor.py
処理内容:tkinterでコンボボックスの設定サンプル
対応:pydroid3対応 Macは非対応?
補足:Harigami上での実行は不可
"""
from logging import shutdown
from tkinter import *
import tkinter as tk
import tkinter.ttk as ttk
import datetime
import os, sys, platform
import glob
from PIL import Image, ImageDraw, ImageFont
import PIL.ExifTags as ExifTags
from PIL import Image, ImageTk
# メッセージボックス
from tkinter import messagebox
# 自作ライブラリ
import usefully
# 透かし文字の透明度
_opacity = 70
_colorlist = ["桃", "橙", "紫", "黄緑", "黄", "桜"]
_colorrgblist = [
[240, 145, 153],
[238, 120, 0],
[136, 72, 152],
[188, 226, 91],
[255, 217, 0],
[254, 244, 244],
]
"""
_colorlist = ['桃','橙','紫','水','黄','桜','茶','鼠','黄緑','金']
_colorrgblist = [[240,145,153],[238,120,0],
[136,72,152],[188,226,91],
[255,217,0],[0,0,0],
[0,0,0],[0,0,0],
[0,0,0],[0,0,0]]
"""
"""
関数名 : messageboxshow
引数 : title タイトル
message メッセージ
機能:メッセージボックス表示
作成日:2021/09/25
修正日:
"""
def messageboxshow(title, message):
messagebox.showinfo(title, message)
"""
関数名 : value_reset
機能:色リセット
作成日:2021/10/03
修正日:
"""
def value_reset():
# 定数
BLACK_R_NUM = 0
BLACK_G_NUM = 0
BLACK_B_NUM = 0
GLAY_R_NUM = 128
GLAY_G_NUM = 128
GLAY_B_NUM = 128
SKY_R_NUM = 137
SKY_G_NUM = 189
SKY_B_NUM = 222
WHITE_R_NUM = 255
WHITE_G_NUM = 255
WHITE_B_NUM = 255
# 切替コントロール
controlchoice_num = controlchoice.get()
# 色
colorresetchoice_num = colorresetchoice.get()
if colorresetchoice_num == 10:
base_r_value = BLACK_R_NUM
base_g_value = BLACK_G_NUM
base_b_value = BLACK_B_NUM
elif colorresetchoice_num == 11:
base_r_value = GLAY_R_NUM
base_g_value = GLAY_G_NUM
base_b_value = GLAY_B_NUM
elif colorresetchoice_num == 12:
base_r_value = SKY_R_NUM
base_g_value = SKY_G_NUM
base_b_value = SKY_B_NUM
elif colorresetchoice_num == 13:
base_r_value = WHITE_R_NUM
base_g_value = WHITE_G_NUM
base_b_value = WHITE_B_NUM
else:
base_r_value, base_g_value, base_b_value = value_num_set(
colorresetchoice_num - 14
)
if controlchoice_num == 1 or controlchoice_num == 3:
ft_comboBackR.set(base_r_value)
ft_comboBackG.set(base_g_value)
ft_comboBackB.set(base_b_value)
if controlchoice_num == 2 or controlchoice_num == 3:
ft_comboFigureR.set(base_r_value)
ft_comboFigureG.set(base_g_value)
ft_comboFigureB.set(base_b_value)
"""
関数名 : value_num_set
引数 : num 色配列番号
機能:色を返却
作成日:2021/09/25
修正日:
"""
def value_num_set(num):
base_r_value = _colorrgblist[num][0]
base_g_value = _colorrgblist[num][1]
base_b_value = _colorrgblist[num][2]
return base_r_value, base_g_value, base_b_value
"""
関数名 : close_window
機能:終了
作成日:2021/09/25
修正日:
"""
def close_window():
root.destroy()
"""
関数名 : dummy_def
機能:外に出して疑似的に非表示
作成日:2021/10/03
修正日:
"""
def dummy_def():
# 外に出して疑似的に非表示にする
rdo4.place(x=-100, y=0)
"""
関数名 : imgfile_make
機能:透かしを入れた画像を作成する
引数 fname :ファイルパス
作成日:2021/10/03
修正日:
"""
def imgfile_make(fname):
#
imgpath = os.path.abspath(fname)
imgheadfilepath, imgext = os.path.splitext(imgpath)
(
comboBackR,
comboBackG,
comboBackB,
comboFigureR,
comboFigureG,
comboFigureB,
) = get_colorvaluetocode()
comboOpacity = int(ft_combo_opacity.get())
# 画像を開いてサイズを調べる
img = Image.open(fname)
w, h = img.size
# インスタグラムだと投稿時に画像が入りきらないことがあるため、縦横を3分の2に縮めた画像をメモリに持たせる (*2)
resized_img = img.resize((int(w / 3 * 2), int(h / 3 * 2)))
# 下地を白で 新しい画像オブジェクトを作成
imgnew = Image.new("RGB", (w, h), (comboBackR, comboBackG, comboBackB))
# 元画像をコピー、但し中央寄せにする
imgnew.paste(resized_img, (int(w / 6), int(h / 6)))
# 埋め込む文字の設定
draw = ImageDraw.Draw(imgnew)
# OSによって標準ディレクトリを決める
# (Windowsで起動するか、Androidで起動するか)※現時点でFlask/Djangoでの実行は考慮保留
if platform.system() == "Windows":
basedirectory = os.path.dirname(os.path.abspath(sys.argv[0]).replace("\\", "/"))
else:
basedirectory = "/storage/emulated/0"
font = ImageFont.truetype(
basedirectory + "/fonts/GenJyuuGothic-Monospace-Normal.ttf", 200
)
# 撮影時刻を取得する
imgshottime = get_shot(fname)
dtpImgshottime = datetime.datetime.strptime(imgshottime, "%Y:%m:%d %H:%M:%S")
dtfImgshottime = datetime.datetime.strftime(dtpImgshottime, "%Y-%m-%d %H:%M:%S")
# # 1段目
textcontents = "あいちのトミー 撮影 on "
# 埋め込む文字の高さ・幅を取得する
fontw, fonth = draw.textsize(textcontents, font)
textleft = int(w / 3 * 2) + int(w / 6) - fontw - 1
texttop = int(h / 3 * 2) + int(h / 6) - fonth * 2 - 6
# draw.text((int(textleft),int(texttop)), textcontents ,(comboFigureR,comboFigureG,comboFigureB),font=font)
# draw.text((int(textleft),int(texttop)), textcontents ,fill=((comboFigureR,comboFigureG,comboFigureB) + (_opacity,)),font=font)
draw.text(
(int(textleft), int(texttop)),
textcontents,
fill=((comboFigureR, comboFigureG, comboFigureB) + (comboOpacity,)),
font=font,
)
# # 2段目
textcontents = dtfImgshottime
# 埋め込む文字の高さ・幅
fontw, fonth = draw.textsize(textcontents, font)
textleft = int(w / 3 * 2) + int(w / 6) - fontw - 1
texttop = int(h / 3 * 2) + int(h / 6) - fonth - 5
draw.text(
(int(textleft), int(texttop)),
textcontents,
(comboFigureR, comboFigureG, comboFigureB),
font=font,
)
# showはwindows起動の場合のみ
imgnew.show()
# 現在時刻(年月日時分秒を区切り記号無しで出力)
nowtime = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
# 透かし画像は別ディレクトリに別ファイルに保存
# imgnewfilepath = os.path.dirname(imgheadfilepath).replace('\\', '/') + '/out/'
# imgnewfilepath += os.path.splitext(os.path.basename(imgheadfilepath))[0] + "_" + nowtime + imgext
# print(imgnewfilepath)
# 透かし画像は上ディレクトリに別ファイルとして保存
os.chdir(os.path.dirname(imgheadfilepath).replace("\\", "/") + "/")
os.chdir("../")
# imgnewfilepath = os.path.dirname(imgheadfilepath).replace('\\', '/') + '/'
imgnewfilepath = os.getcwd().replace("\\", "/") + "/"
imgnewfilepath += (
os.path.splitext(os.path.basename(imgheadfilepath))[0] + "_" + nowtime + imgext
)
print(imgnewfilepath)
# 指定したファイルパスで保存
imgnew.save(imgnewfilepath, "JPEG", quality=90)
"""
関数名 : button_process
機能:埋め込みボタン処理
作成日:2021/09/25
修正日:
"""
def button_process():
# パスの設定
if platform.system() == "Windows":
basedirectory = os.path.dirname(os.path.abspath(sys.argv[0]).replace("\\", "/"))
basepicdirectory = basedirectory
else:
basedirectory = "/storage/emulated/0"
basepicdirectory = "/storage/emulated/0/DCIM/Camera/img"
directorylist_direct = glob.glob(basepicdirectory + "/*.jpg", recursive=False)
# 非活性化
ft_make_button["state"] = tk.DISABLED
i = 0
for f in directorylist_direct:
i += 1
f = f.replace("\\", "/")
# 透かしを入れた画像を作成のメイン処理を開始する
imgfile_make(f)
messageboxshow("完了", str(i) + "件処理しました。")
# 非活性化
ft_make_button["state"] = tk.NORMAL
"""
関数名 : button_colorchange
機能:カラーボタン処理
引数:
作成日:2022/06/10
修正日:
"""
def button_colorchange():
(
comboBackR,
comboBackG,
comboBackB,
comboFigureR,
comboFigureG,
comboFigureB,
) = get_colorvaluetocode()
# 背景色
bgcolor = "#" + colornumtohex(comboBackR, comboBackG, comboBackB)
ft_color_button["bg"] = bgcolor
# 前景色
fgcolor = "#" + colornumtohex(comboFigureR, comboFigureG, comboFigureB)
ft_color_button["fg"] = fgcolor
messageboxshow("完了", "処理しました。")
"""
関数名 : get_colorvaluetocode
機能:コンボボックスの値から色の数値を変数に格納
戻り値:背景色R、背景色G、背景色B、前景色R、前景色G、前景色B
作成日:2022/06/10
修正日:
"""
def get_colorvaluetocode():
return (
int(ft_comboBackR.get()),
int(ft_comboBackG.get()),
int(ft_comboBackB.get()),
int(ft_comboFigureR.get()),
int(ft_comboFigureG.get()),
int(ft_comboFigureB.get()),
)
"""
関数名 : from_rgb_to_colorcode
機能:RGB変換
引数 rgb :RGB値
作成日:2021/10/03
修正日:
"""
def from_rgb_to_colorcode(rgb):
tup = tuple(rgb)
print(tup)
return "#%02x%02x%02x" % tup
"""
関数名 : from_rgb_to_colorcode
機能:EXIFから撮影時刻を取得する
引数 fname :ファイルパス
作成日:2021/10/03
修正日:
"""
def get_shot(fname):
# 画像ファイルを開く
im = Image.open(fname)
print(fname)
# EXIF情報を辞書型で得る
exif = {ExifTags.TAGS[k]: v for k, v in im._getexif().items() if k in ExifTags.TAGS}
# 撮影日時を得る
shot_tags = exif["DateTimeOriginal"]
return shot_tags
"""
関数名 : numwide
引数 : num 半角数字
戻り値:全角化した数字
機能:半角数字を全角にする
作成日:2021/09/25
修正日:
"""
def numwide(num):
if int(num) < 10:
int_n = ord(str(int(num)))
return chr((int_n) + 65248)
else:
return num
"""
関数名 : comboset
引数 : combo コンボボックス
initialnum 初期値
minnum 最小値
maxnum 最大値
機能:コンボボックスの設定
作成日:2021/09/25
修正日:
"""
def comboset(combo, initialnum, minnum, maxnum):
# combo = ttk.Combobox(root, width = 4, state='readonly',justify='right')
# 選択肢設定
combovalue = []
# コンボボックスのスクロールバーの設定
style = ttk.Style()
style.theme_use("clam")
style.configure(
"Vertical.TScrollbar",
gripcount=0,
background="Blue",