Плюсик+арты

+134
в блоге Pixel Art is Magic
Дерпи
БуквыНаиболее комфортный мне формат пиксель-артов 32х32 для удобства просмотра приходится растягивать. Отдельные точки при этом могут смотреться неприглядно, а горизонтальные и вертикальные линии слишком выделяются. Можно замостить холст не квадратами, Hexels тому пример. Мне подумалось взять основой плюсики из пяти пикселей. Структура сохраняет «ламповость» пикселей, но горизонтальные и вертикальные линии при этом наклонены, отдельные точки выглядят интереснее — сплошные плюсы)

RD
FS
RR
TW
AJ
PP

22 комментария

Скрипт на Python
from PIL import Image

sideIn = 32
sideOut = 96

inn = Image.open('Input.png').convert('RGB')
out = Image.new("RGB", (sideOut, sideOut), (255, 255, 255))

for ix in range(0,sideIn):
  for iy in range(0,sideIn):
    color = inn.getpixel((ix,iy))
    ox = sideIn+ ix*2 -iy
    oy = 1+ iy*2 +ix
    out.putpixel((ox,oy-1), color)
    out.putpixel((ox-1,oy), color)
    out.putpixel((ox,oy), color)
    out.putpixel((ox+1,oy), color)
    out.putpixel((ox,oy+1), color)

out.save('Output.png', 'PNG')
re7natus
+3
Какая странная, но прикольная штука.
dementra369
+1
Ахах, я полностью согласен
digimaster
0
С обычными векторнами артами получаются своеобразные шакалы)

p.s. слегка отредактировал скрипт, добавив альфа-канал
Спойлер
from PIL import Image


def main():
    side_in = 40
    side_out = 120

    for i in range(1, 349):
        inn = Image.open('IN/tbn{}.png'.format(str(i).zfill(4))).convert('RGBA')
        out = Image.new("RGBA", (side_out, side_out), (255, 255, 255, 0))

        for ix in range(0, side_in):
            for iy in range(0, side_in):
                color = inn.getpixel((ix, iy))
                ox = side_in + ix * 2 - iy
                oy = 1 + iy * 2 + ix
                out.putpixel((ox, oy - 1), color)
                out.putpixel((ox - 1, oy), color)
                out.putpixel((ox, oy), color)
                out.putpixel((ox + 1, oy), color)
                out.putpixel((ox, oy + 1), color)

        out.save('OUT/tbn{}.png'.format(str(i).zfill(4)), 'PNG')


if __name__ == "__main__":
    main()

Sasha-Flyer
+4
Забавно. Тут видно, что сетка «пикселей» наклонилась вместе с артом.
re7natus
+1
Можно сделать ещё прикольнее:
1. Применяем к картинке этот скрипт
2. Флипаем (зеркалим) наклонённую таким способом картинку по горизонтали
3. Вновь пропускаем через скрипт, который теперь наклоняет картинку в обратную сторону, так что горизонт вновь становится горизонтальным
4. Флипаем по горизонтали в исходное состояние.
5. Срезаем прозрачные «поля» изображения, чтобы осталась только сама картинка.

Получаем забавный способ масштабирования пиксельарта со сглаживаением сетки.
Пример того, как это выглядит:
Оригинал
Обработка по вышеуказанному алгоритму
Простое масштабирование до тех же размеров
Lyx
+1
Да, изначально подумывал использовать алгоритм подобным образом.
Характерная «пушистая» текстура имеет свой шарм, как вижу, не для меня одного)
Реализовать можно проще, заменяя пиксель блоком из 25 пикселей.
re7natus
0
В принципе можно. Выглядеть эта замена будет
примерно такКаждый пиксель оригинального изображения заменяется обведённым тут рамочкой блоком 5x5, где основной цвет — это цвет самого пикселя, а по одному пикселю на каждой границе окрашено в цвета смежных пикселей.
Lyx
0
Пример скрипта
from PIL import Image


def main():
    side_in = 128
    f_in = "CelF128.png"
    f_out = "CelF128_o.png"

    side_out = side_in*5

    inn = Image.open(f_in).convert('RGBA')
    out = Image.new("RGBA", (side_out, side_out), (255, 255, 255, 0))

    for iy in range(0, side_in):
        for ix in range(0, side_in):
            color = inn.getpixel((ix, iy))
            color_L = inn.getpixel((ix-1, iy))
            color_U = inn.getpixel((ix, iy-1))
            if ix == (side_in-1):
                color_R = inn.getpixel((0, iy))
            else:
                color_R = inn.getpixel((ix+1, iy))
            if iy == (side_in-1):
                color_D = inn.getpixel((ix, 0))
            else:
                color_D = inn.getpixel((ix, iy+1))
            ox = ix * 5
            oy = iy * 5
            for i in range(-2,3):
                for j in range(-2,3):
                    out.putpixel((ox+i, oy+j), color)
            out.putpixel((ox-2, oy - 1), color_L)
            out.putpixel((ox+2, oy + 1), color_R)
            out.putpixel((ox+1, oy - 2), color_U)
            out.putpixel((ox-1, oy + 2), color_D)

    out.save(f_out, 'PNG')


if __name__ == "__main__":
    main()
Результат работы
Lyx
0
В догонку скрипт более мелкой трёхпиксельной пушистости
from PIL import Image


def main():
    side_in = 128
    f_in = "Tia128.png"
    f_out = "Tia128_x3o.png"

    side_out = side_in*3

    inn = Image.open(f_in).convert('RGBA')
    out = Image.new("RGBA", (side_out, side_out), (255, 255, 255, 0))

    for iy in range(0, side_in):
        for ix in range(0, side_in):
            color = inn.getpixel((ix, iy))
            color_L = inn.getpixel((ix-1, iy))
            color_U = inn.getpixel((ix, iy-1))
            if ix == (side_in-1):
                color_R = inn.getpixel((0, iy))
            else:
                color_R = inn.getpixel((ix+1, iy))
            if iy == (side_in-1):
                color_D = inn.getpixel((ix, 0))
            else:
                color_D = inn.getpixel((ix, iy+1))
            ox = ix * 3
            oy = iy * 3
            for i in range(-1,2):
                for j in range(-1,2):
                    out.putpixel((ox+i, oy+j), color)
            out.putpixel((ox-1, oy + 1), color_L)
            out.putpixel((ox-1, oy - 1), color_U)
            out.putpixel((ox+1, oy - 1), color_R)
            out.putpixel((ox+1, oy + 1), color_D)

    out.save(f_out, 'PNG')


if __name__ == "__main__":
    main()
Результат
Lyx
0
А ведь кстати, весьма интересно получается!
makise_homura
0
Очень мило смотрятся!
NovemberDragon
+2
А можно сделать так же, но не плюсики, а… /\ вот такие штуки, как стежки ниток на вязаном свитере?
DMW
+1
Вряд ли, потому что нужна симметрия как по горизонтали, так и по вертикали, а ваша фигура только по одной оси симметрична.
Lyx
+1
Вот так?
re7natus
+5
Ооо, да, именно так!
DMW
+2
Интересненько выглядит.
Почему-то напомнило марки.
dementra369
+2
Лол, и правда как свитер =)
Теперь я хочу себе такой свитер с Дёрпи!)))
makise_homura
0
Это, наверное, можно сделать не только с Дёрпи, но кто знает, как это будет выглядеть. И кажется, что одного только изображения конечного результата недостаточно, чтоб человек смог это связать. А вообще — да, свитер с пони согревал бы не только тело, но и сердечко
DMW
+1
Сильное колдунство.
gor1ck
+1
Вау, а красиво же. Визуально чувствуются такие вайбы вышивки, что ли)
Кстати, а почему Twilight Sparkle = TW, а не TS? =)
makise_homura
0
Мне уже советовали попробовать вышивать такое. Прикинул — вроде реально, но копыта нескоро дойдут.
Не силён в общепризнанных сокращениях. И как-то забываю, что она Sparkle: привык, что просто Twi или Twiley)
re7natus
+1
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Скрыто Показать