Блог компании Pixonic
Python
Обработка изображений
Программирование
Читальный зал
Комментарии 21
+7
Где-то у меня валяется код на Actionscript 3, рендерящий относительно пристойно выглядящий лес, размером строк в двести и 12 килобайт исполняемого кода (SWF). Правда, вместо попиксельной рисовки там честное (почти честное) 3D для каждого дерева в лесу. Ну и работает со скоростью роста настоящего леса. Ссылки попротухали за шесть лет, но перевыложить могу, в принципе.
+4
Напишите публикацию, уверен, многим будет интересно (мне — точно).
+1
Под Python 3.6.6, может кому пригодится.

Сам код
import PIL, random
from PIL import Image, ImageDraw
origDimension = 1500
r = lambda: random.randint(50,215)
rc = lambda: (r(), r(), r())
listSym = []
def create_square(border, draw, randColor, element, size):
  if (element == int(size/2)):
    draw.rectangle(border, randColor)
  elif (len(listSym) == element+1):
    draw.rectangle(border,listSym.pop())
  else:
    listSym.append(randColor)
    draw.rectangle(border, randColor)
def create_invader(border, draw, size):
  x0, y0, x1, y1 = border
  squareSize = (x1-x0)/size
  randColors = [rc(), rc(), rc(), (0,0,0), (0,0,0), (0,0,0)]
  i = 1
  for y in range(0, size):
    i *= -1
    element = 0
    for x in range(0, size):
      topLeftX = x*squareSize + x0
      topLeftY = y*squareSize + y0
      botRightX = topLeftX + squareSize
      botRightY = topLeftY + squareSize
      create_square((topLeftX, topLeftY, botRightX, botRightY), draw, random.choice(randColors), element, size)
      if (element == int(size/2) or element == 0):
        i *= -1
      element += i
def main(size, invaders, imgSize):
  origDimension = imgSize
  origImage = Image.new('RGB', (origDimension, origDimension))
  draw = ImageDraw.Draw(origImage)
  invaderSize = origDimension/invaders
  padding = invaderSize/size
  for x in range(0, invaders):
    for y in range(0, invaders):
      topLeftX = x*invaderSize + padding/2
      topLeftY = y*invaderSize + padding/2
      botRightX = topLeftX + invaderSize - padding
      botRightY = topLeftY + invaderSize - padding
      create_invader((topLeftX, topLeftY, botRightX, botRightY), draw, size)
  origImage.save("Result" + str(size) + "x" + str(size) + "-" + str(invaders) + "-" + str(imgSize) + ".jpg")
  print('Файл успешно создан')

while True:
  size = input('Введите размер спрайта, не кратно 2 a = (1,3,5,7,9,11...)\n')
  if size == 'exit' or size == 'e' or size == 'EXIT' or size == 'quit' or size == 'q' or size == 'Q' or size == 'E':
    break
  invaders = input('Введите кол-во спрайтов(1,2,3,4,5,6,7...)\n')
  if invaders == 'exit' or invaders == 'e' or invaders == 'EXIT' or invaders == 'quit' or invaders == 'q' or invaders == 'Q' or invaders == 'E':
    break
  imgSize = input('Введите разрешение картинки(50,100,150...)\n')
  if imgSize == 'exit' or imgSize == 'e' or imgSize == 'EXIT' or imgSize == 'quit' or imgSize == 'q' or imgSize == 'Q' or imgSize == 'E':
    break
  try:
    main(int(size), int(invaders), int(imgSize))
  except IndexError:
    print('Фигово вводите... Попробуйте ещё раз')
  except ValueError:
    print('Даже по цифрам не попадаете... Попробуйте ещё раз')

+1
Кажется это можно использовать как новый метод стеганографии.Нужно хеш-стеганографию подружить с генеративным искусством ;))
+10

А расшифровку этого метода назовём дегенеративным искусством.

+2
И если теперь подключить к вязальной машине, можно сделать интересный свитер. Но скучно, наверное.
+2
Сравнивать размер исходников и заоптимизированного под компактность скомпилированного бинарника — довольно неблагодарное занятие. Ну и вообще, где энтрилевельный любительский код на питоне, а где демосцена.
0
Благодарное. Хорошая иллюстрация — есть к чему стремиться. В конце концов в компо ограничение на объём, и не важно на чём написано.

А по ключевому слову «демосцена» можно найти достаточно материалов по процедурной графике в том числе.

Полезно знать общественное цифровое наследие и достояние.
0
А возможностей питона хватит чтобы визуализировать содержимое подключенного тома или папки вот в таком виде:

Скриншот k4dirstat



У меня есть желание создать свой похожий алгоритм, визуализирующий содержимое директорий и дисков, но я не знаю как подступиться к задаче. Т.к. знания о программировании ограничены знаниями BASIC, изученного больше десятилетия назад.
0
«чтобы визуализировать содержимое подключенного тома или папки...»)

«Скриншот k4dirstat»
0
Эти квадратные и прямоугольные ячейки отображают файлы. Чем больше размер файла, тем больше площадь ячейки. Но мне не нравится эта визуализация, хочу свою запилить и не знаю как начать.
+1
Хватит. Советую для начала почитать туториал на английском в документации Python, если с английским проблем нет (даже если есть — лучше попробовать). Советую так же узнать что такое pip для python и как им пользоваться.

Вижу k4dirstat написан на Qt. Есть PyQt, с помощью которого можно зафигачить такой же интерфейс и привязать его к проге на питоне. Если не боитесь чужого кода (и вообще это отличная мысль) можно даже попробовать портировать интерфейс самого k4dirstat. Qt у нас кросплатформенный.

Можно и на tkinter'е написать интерфейс в принципе, если хотите. Он вовсе включен в стандартную библиотеку питона.
0
Сама программа хорошая и удобная. Меня не устраивает часть, которая визуализирует размер файлов.

Я как программер нулевой, моя компетенция GUI и визуальные «рюшечки». Просто пока я изучу работу с ОС, ФС, файлами и т.п. то состарюсь до 70 лет :)

А если я алгоритмически опишу свою версию хотя бы в общих чертах, то разраб k4dirstat вероятно возьмет мой алгоритм.

+1
Да, дерзай. Вообще питон довольно простой язык и я сомневаюсь, что на какое-нибудь вообще решение этой проблемы будет потрачено настолько много времени. Полагаю там надо будет использовать встроенный модуль os для действий с… ОС.
Только полноправные пользователи могут оставлять комментарии. , пожалуйста.