Нужное кол-во пикселей Python
Есть код:
from PIL import Image, ImageDraw
import random
image = Image.new("RGBA", (320,320), (0,0,0,0))
draw = ImageDraw.Draw(image)
letters_simbols_nums = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', str(chr(92)), ']', "^", "_", "`", '\n']
colors = [255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164]
f = open("text.txt", 'r')
text = f.read()
f.close()
text = list(text)
length = len(text)
if length % 2 == 0:
image = Image.new("RGBA", (int(length / 2), int(length / 2)), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
for y in range(0, int(length / 2)):
for x in range(0, int(length / 2)):
if len(text) > 0:
simbol = text[0]
pos = letters_simbols_nums.index(simbol)
color = colors[pos]
draw.point((x, y), fill=(color, 255, 255))
text.pop(0)
else:
del draw
image.save('test.png')
exit()
Мне нужно, чтобы изображение которое я сохраняю было размером на то кол-во пикселей, которые я нарисовал.
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Нужно было только правильно определить примерный размер картинки, чтобы все символы рационально влезли в картинку.
Для упрощения и красоты рисуем квадратную картинку.
Накидал пример:
from PIL import Image, ImageDraw
letters_simbols_nums = [
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l',
'z', 'x', 'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ' ', '!', '"', '#', '$',
'%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', "^", "_", "`", '\n'
]
colors = [
255, 254, 253, 252, 251, 250, 249, 248, 247, 246, 245, 244, 243, 242, 241, 240, 239, 238, 237, 236, 235, 234,
233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 218, 217, 216, 215, 214, 213, 212,
211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, 193, 192, 191, 190,
189, 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, 168,
167, 166, 165, 164
]
image = Image.new("RGBA", (320, 320), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
text = """\
Lorem ipsum dolor sit amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore
magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea
commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim id
est laborum.
"""
items = list(text)
# Подбираем размер, наиболее близкий к длине текста
img_size = -1
for s in range(2, 1000):
if s * s >= len(items):
img_size = s
break
assert img_size != -1, "Неудалось подобрать размер изображения"
image = Image.new("RGBA", (img_size, img_size), (0, 0, 0, 0))
draw = ImageDraw.Draw(image)
for y in range(img_size):
for x in range(img_size):
if not items:
break
simbol = items.pop(0)
pos = letters_simbols_nums.index(simbol)
color = colors[pos]
draw.point((x, y), fill=(color, 255, 255))
image.save('result.png')
Результат (размер 22x22 пикселя):
Результат (с масштабом):

