P
P
ptvalx2020-06-08 09:22:17
Python
ptvalx, 2020-06-08 09:22:17

How to enlarge image x*2 and y*2 without interpolation?

It is necessary to turn a three-color image 64x64 into 256x256 so that the color that was:
1,0,0,...
0,0,0,...
0,0,0,...
...
Spread like this:
1,1, 0,...
1,1,0,...
0,0,0,...
...

Tried Pillow with different interpolation modes on resize - nothing came up. I think it can be done through NumPy, but what functions?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alan Gibizov, 2020-06-08
@ptvalx

Please don't hit. Here I stole the source code from habra and scrawled it as best I could:

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()

Surely this could have been done much more beautifully and optimally, and N times faster. But already "what they fertilized, then it grew" ...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question