Pixonic corporate blog
Python
Image processing
Programming
Reading room
Comments 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 для действий с… ОС.
Only logged in users are able to leave comments. , please.