@ptvalx

Как увеличить изображение x*2 и y*2 без интерполяции?

Нужно трёхцветное изображение 64х64 превратить в 256х256 чтоб цвет, который был:
1,0,0,...
0,0,0,...
0,0,0,...
...
Распространился так:
1,1,0,...
1,1,0,...
0,0,0,...
...

Пробовал Pillow с разными режимами интерполяции на resize - ничего не подошло. Думаю, это можно сделать через NumPy, но какой функций?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Не бейте, пожалуйста. Вот стырил исходный код с habra и накарябал как смог:
spoiler
from PIL import Image, ImageDraw  # Подключим необходимые библиотеки.

image = Image.open("temp.jpg")  # Открываем изображение.
width = image.size[0]  # Определяем исходную ширину.
height = image.size[1]  # Определяем исходную высоту.
pix = image.load()  # Выгружаем значения пикселей исходной картинки.

imagemode = image.mode  # Получаем цветовой формат исходного изображения
multiplicator = 2  # тут множитель, по-умолчанию 2
newwidth = width * multiplicator  # вычисляем новую высоту
newheight = height * multiplicator  # вычисляем новую ширину
newimage = Image.new(mode=imagemode, size=(newwidth, newheight))  # создаем новую картинку
newpix = newimage.load()  # загружаем новую картинку попиксельно
draw = ImageDraw.Draw(newimage)  # создаем инструмент рисования

if __name__ == '__main__':
    new_image_list = []  # создаем пустой массив строк нового изображения
    for i in range(width):
        new_line_list = []  # создаем пустой массив очередной новой строки
        for j in range(height):  # получаем цветность очередного пикселя исходной картинки
            newpixel = pix[i, j]
            for _ in range(multiplicator):  # лепим в конец массива новой строки нужное кол-во таких пикселей
                new_line_list.append(newpixel)
        for _ in range(multiplicator):  # лепим в конец массива строк нужное кол-во вновь созданных строк
            new_image_list.append(new_line_list)

    for i in range(newwidth):  # рисуем построчно попиксельно новую картинку из массива строк нового изображения
        for j in range(newheight):
            pixel = tuple(new_image_list[i][j])
            draw.point((i, j), pixel)

newimage.save("ans.bmp", "BMP")  # записываем всё это в файл (выбрал bitmap потому, что там явно получаются пиксели
# как заказано, без дальнейшей оптимизации форматом jpg
del draw
image.close()
newimage.close()


Наверняка это можно было сделать гораздо красивее и оптимальнее, и быстрее в N раз. Но уж "чем удобряли, то и выросло"...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы