Solution

문장단위로 이미지 파일로 된 세로쓰기 소설 읽기 프로그램 ver.1.1

storkbear 2022. 8. 30. 16:39
from PIL import Image, ImageTk
import tkinter as tk
import os


print('filepath : ')
filepath=input()
print('pixel size :')
pixel_size=int(input())
print('length : ')
length=int(input())
print('start page : ')
page=int(input())-1
i=0
filenames = os.listdir(filepath)
image1 = Image.open(filepath + '/' + filenames[page])

window=tk.Tk()
canvas=tk.Canvas(window, width=pixel_size, height=length)
canvas.pack()
image1=image1.resize((image1.size[0]*length//image1.size[1],length))
croppedImage = image1.crop((image1.size[0] - pixel_size * (i + 1), 0, image1.size[0] - pixel_size * i, image1.size[1]))
tk_img=ImageTk.PhotoImage(croppedImage)
container=canvas.create_image(0,0,anchor='nw',image=tk_img)
window.title('[%d/%d]' % (page + 1, len(filenames)))
# 이미지 자르기 crop함수 이용 ex. crop(left,up, rigth, down)

def next_cut(event):
    global i
    global image1
    global pixel_size
    global container
    global length
    i += 1
    croppedImage = image1.crop((image1.size[0] - pixel_size * (i*0.1 + 1), 0, image1.size[0] - pixel_size * i*0.1, image1.size[1]))
    tk_img1 = ImageTk.PhotoImage(croppedImage)
    canvas.itemconfig(container,image=tk_img1)
    canvas.imgref = tk_img1
    window.title('[%d/%d]' % (page + 1, len(filenames)))
def before_cut(event):
    global i
    global image1
    global pixel_size
    global length
    i -= 1
    croppedImage = image1.crop((image1.size[0] - pixel_size * (i*0.1 + 1), 0, image1.size[0] - pixel_size * i*0.1, image1.size[1]))
    tk_img1 = ImageTk.PhotoImage(croppedImage)
    canvas.itemconfig(container,image=tk_img1)
    canvas.imgref = tk_img1
    window.title('[%d/%d]' % (page + 1, len(filenames)))
def next_page(event):
    global i
    global image1
    global page
    global filepath
    global filenames
    global pixel_size
    global length
    i = 0
    page += 1
    image1 = Image.open(filepath + '/' + filenames[page])
    image1=image1.resize((image1.size[0] * length // image1.size[1], length))
    croppedImage = image1.crop((image1.size[0] - pixel_size * (i + 1), 0, image1.size[0] - pixel_size * i, image1.size[1]))
    tk_img1 = ImageTk.PhotoImage(croppedImage)
    canvas.itemconfig(container,image=tk_img1)
    canvas.imgref = tk_img1
    window.title('[%d/%d]' % (page + 1, len(filenames)))
def before_page(event):
    global i
    global image1
    global page
    global filepath
    global filenames
    global pixel_size
    global length
    i = 0
    page -= 1
    image1 = Image.open(filepath + '/' + filenames[page])
    image1=image1.resize((image1.size[0] * length // image1.size[1], length))
    croppedImage = image1.crop((image1.size[0] - pixel_size * (i + 1), 0, image1.size[0] - pixel_size * i, image1.size[1]))
    tk_img1 = ImageTk.PhotoImage(croppedImage)
    canvas.itemconfig(container,image=tk_img1)
    canvas.imgref = tk_img1
    window.title('[%d/%d]' % (page + 1, len(filenames)))
def pixel_change(event):
    global i
    global image1
    global pixel_size
    global length
    i=0
    print('changed pixel size : ')
    pixel_size = int(input())
    croppedImage = image1.crop((image1.size[0] - pixel_size * (i + 1), 0, image1.size[0] - pixel_size * i, image1.size[1]))
    tk_img1 = ImageTk.PhotoImage(croppedImage.resize((pixel_size,length)))
    canvas.itemconfig(container, image=tk_img1)
    canvas.imgref = tk_img1
    window.title('[%d/%d]' % (page + 1, len(filenames)))
window.bind('<d>',next_cut)
window.bind('<a>',before_cut)
window.bind('<e>',next_page)
window.bind('<q>',before_page)
window.bind('<c>',pixel_change)

window.mainloop()

수정 내역: 이미지를 크롭한뒤에 리사이즈해서 글씨가 원래의 비율을 잃어버리는 문제가 있다.( 대신 글자는 크게 볼수있음)

비율을 유지하기 위해서 리사이즈한뒤에 원하는 크기로 크롭, 비율을 유지하여 글씨가 찌그러지지 않게 바꾸었다. (대신 글자가 원래의 비율이기 때문에 작은 length로 설정하면 읽기 어려울 수 있다.)

용량문제 (패키지)로 첨부는 불가능