Результат, которого я хочу достичь (создан вручную с помощью Photoshop):

В основном я хочу автоматизировать следующие процессы, упакованные в небольшое окно инструментов, например tkinter:
- Загрузить изображение
- Уменьшите его цвета до заданной пользователем величины (квантование )
- Пикселизация; на собственный «размер блока», также определяемый пользователем. В пиксельных единицах, например; 16x16px
- Создать наложение сетки на основе того же «размера блока».
- Создать уникальные «символы», соответствующие количеству цветов (анализировать значения RGB). и разместив их в сетке/сводной таблице/таблице.
Я знаю, как сделать все вручную в такой программе, как Photoshop. Мне нужна помощь в понимании, как это сделать в Python. Особенно, когда размер сетки меняется.
На данный момент мои исследования (как полный новичок в Python, с некоторыми базовыми уроками) сводятся к изучению вариантов на каждом этапе. Я понял, какие расчеты мне нужны для уменьшения цветов; квантование в PIL, как пикселизировать в PIL и как извлекать значения RGB, чтобы соединить их с уникальными сгенерированными символами. Но после этого мне бы хотелось получить несколько указаний о том, как «наложить» сетку с помощью этих символов.
Опять же, я хочу научиться, поэтому не ищу точного решения.
Вот моя настройка
import tkinter as tk
from tkinter import ttk
from PIL import Image
import numpy as np
import os
# root window
root = tk.Tk()
root.geometry('300x200')
root.title('Embroidery Generator')
# Load image button (This is how I would like the tool to operate)
loadLabel= tk.Label(
root,
text='Source image',
)
loadLabel.grid(
row=0,
column=0,
sticky='w',
)
loadButton= ttk.Button(
root,
text='Load...',
)
loadButton.grid(
row=0,
column=1,
sticky='w',
)
# Max Colors Entry
maxColorsLabel= tk.Label(
root,
text='Max. colors'
)
maxColorsLabel.grid(
row=1,
column=0,
sticky='w',
)
e1= tk.Entry(
root,
)
e1.grid(
row=1,
column=1,
sticky='w',
)
# Grid size Entry
gridLabel= tk.Label(
root,
text='Grid size'
)
gridLabel.grid(
row=2,
column=0,
sticky='w',
)
e2= tk.Entry(
root,
)
e2.grid(
row=2,
column=1,
sticky='w',
)
# Quantization button to reduce max color (will become user input)
def quantize():
im = Image.open(os.path.expanduser("~/Downloads/surf.png")).convert('RGB')
im = im.quantize(4, dither=None)
im.save(os.path.expanduser("~/Downloads/surf_quantized.png"))
im.show()
quantize_button = ttk.Button(
root,
text='1.Quantize',
command=quantize
)
quantize_button.grid(
row=4,
column=0,
sticky='w',
)
# Pixelate button (will also become user input)
def pixelate():
im = Image.open(os.path.expanduser("~/Downloads/surf_quantized.png"))
#find its width & height
w,h = im.size
#find NEW dimensions from user-defined number (in percentages now. Want to transform this in 'blocks' based on pixels)
new_w = w * 0.05
new_h = h * 0.05
#round to nearest whole number and convert from float to int
new_w = np.round(new_w)
new_w = int(new_w)
new_h = np.round(new_h)
new_h = int(new_h)
#downsample image to these new dimensions
down_sampled = im.resize((new_w, new_h))
#upsample back to original size (using "4" to signify bicubic)
up_sampled = down_sampled.resize((w, h), resample = 4)
#save the image
up_sampled.save(os.path.expanduser("~/Downloads/surf_pixalated.png"))
up_sampled.show()
pixelate_button = ttk.Button(
root,
text='2.Pixelate!',
command=pixelate
)
pixelate_button.grid(
row=5,
column=0,
sticky='w',
)
# exit button
exit= ttk.Button(
root,
text="Exit",
command=lambda: root.quit()
)
exit.grid(
row=6,
column=0,
sticky='w',
)
root.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/791 ... lay-and-sy
Мобильная версия