{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Glitching an Image\n", "\n", "Glitching can be achieved in many different ways, including by opening an image file in a text editor and making random changes to the data, or by opening an image file in something like [Audacity](https://www.audacityteam.org/) and running sound filters on the data. \n", "\n", "The code below is by Mathieu Guimond-Morganti, and can be found on Github [here](https://github.com/guimondmm/prism-sort-glitch). His script allows you to take an input picture file (jpg) and specify parameters by which the data in that file will be manipulated. It works by isolating rows and columns of the data and doing a broken sort of the data (see also [this](http://datamoshing.com/2016/06/16/how-to-glitch-images-using-pixel-sorting/)). \n", "\n", "Run the code below to see it glitch this photograph of the Euphronios Krater:\n", "\n", "![the Euphronios Krater](pic01.jpg)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / 1\n", ".......... Done!\n", "\n" ] } ], "source": [ "#!/usr/bin/env python3\n", "# -*- coding: utf-8 -*-\n", "\"\"\"\n", "Prism Sort glitch algorithm v0.1.3.\n", "\n", "Copyright 2016 Mathieu Guimond-Morganti\n", "\n", "This program is licensed under the Creative Commons Attribution-ShareAlike 4.0\n", "International License. To view a copy of this license, visit\n", "http://creativecommons.org/licenses/by-sa/4.0/.\n", "\n", "Usage: %(interpreter)s %(scriptfile)s inputfile [options]\n", "-a, --angle=NUM : rotates the glitch effect by this many degrees\n", " (default: 0, i.e. vertical)\n", "-b, --blocks=NUM : number of blocks (default: 9)\n", " affects the overlapping of the glitch effect\n", " (higher = more intense)\n", "-d, --dither : makes result more noisy, and less blocky\n", "-f, --fuzzyedges : in combination with a rotation, will leave a fuzzy black\n", " border around the image\n", "-h, --help : displays this help message\n", "-H, --horizontal : processes the image horizontally (same as -a 90)\n", "-i, --intensity=NUM : intensity (recommended: -2~2; default: 0)\n", " will not go lower than (3 - number of blocks)\n", "-I, --interpol=NUM : rotation interpolation (default: 0 = bicubic, sharp)\n", " (1 = bilinear, smooth; 2 = nearest, aliased)\n", "-J, --jpeg=NUM : saves as JPEG at the specified quality\n", " (recommended: 75~95)\n", "-n, --numoutput=NUM : number of output files to be generated (default: 1)\n", " the output files are in the format:\n", " _out.\n", " files are overwritten without warning!\n", "-P, --png : saves as PNG (default)\n", "-r, --resize=NUM : resize factor (e.g. 2 divides side by sqrt(2); optional)\n", "-s, --sound : play alert sound when done (silent by default)\n", "-V, --vertical : processes the image vertically (default; same as -a 0)\n", "\"\"\"\n", "\n", "# Images glitched using this algorithm should be licensed under CC-BY-SA 4.0\n", "# as well, with proper attribution, as I believe they constitute\n", "# \"adapted material\" as covered under the terms of the license.\n", "# The reason for this humble request is to encourage people to further\n", "# experiment with this algorithm or its variants, as well as remix\n", "# other people's artwork.\n", "#\n", "# I don't want this project to be solely \"open source\";\n", "# I want it to be \"open art\" as well.\n", "# If no one credits the use of this algorithm, fewer people will use it.\n", "# And a world without glitch art would be sad :'(\n", "#\n", "# Finally, if you feel generous or you want to get in touch,\n", "# my email is guimondmm at gmail dot com\n", "\n", "\n", "from __future__ import print_function # prevent Python 2 crash, unsupported!\n", "from random import random, randrange\n", "from math import sqrt, radians as rad, cos, sin\n", "from platform import system\n", "import sys\n", "import getopt\n", "import subprocess\n", "\n", "try:\n", " BOLD = \"\\x1B[0;1m\" # ANSI escape code for bold or bright text\n", " NORM = \"\\x1B[0m\" # ANSI escape code to reset text to normal\n", " # verify which version of Python is running the script\n", " assert(sys.version_info.major >= 3)\n", "except AssertionError:\n", " print(BOLD+\"\\nThis script requires Python 3.\"+NORM)\n", " print(\"Install it (if needed), then try the command: \"+BOLD,\n", " \"py -3\" if system() == \"Windows\" else \"python3\",\n", " __file__+NORM+\"\\n\")\n", " sys.exit(69)\n", "\n", "try:\n", " # check for prerequisites: Python 3.x, the Pillow module,\n", " # and its dependencies ($ pip3 install Pillow)\n", " # http://pillow.readthedocs.org/en/3.1.x/installation.html\n", " from PIL import Image, ImageOps\n", "except ImportError:\n", " # try to install Pillow automatically\n", " print(\"\\nThis Python 3 script requires the \"+BOLD+\"Pillow\"+NORM+\" module \"\n", " \"and its dependencies.\\nPlease wait...\", end=\"\")\n", " try:\n", " # install is the output of the command in bytes\n", " install = subprocess.Popen([\"pip3\", \"install\", \"Pillow\"],\n", " stdout=subprocess.PIPE,\n", " stderr=subprocess.PIPE).communicate()[0]\n", " except FileNotFoundError as e: # if pip3 is not in PATH\n", " install = bytes(str(e), \"ascii\")\n", " if b'Successfully installed' in install:\n", " print(\"\\r\"+BOLD+\"Pillow was automatically installed.\"+NORM,\n", " \"\\nPlease try running the script again.\\n\")\n", " else: # manual instructions\n", " print(\"\\r\"+BOLD+\"You need to install Pillow manually.\"+NORM)\n", " print(\"Try the command: \"+BOLD, \"pip3 install Pillow\"+NORM)\n", " print(\"or visit\"+BOLD,\n", " \"http://pillow.readthedocs.org/en/3.1.x/installation.html\"\n", " \"\\n\"+NORM)\n", " sys.exit(69)\n", "\n", "\n", "# default parameters\n", "IMAGE_WIDTH, IMAGE_HEIGHT = None, None # will be initialized later\n", "RESIZE_FACT = 1 # each dimension will be resized by sqrt(RESIZE_FACT)\n", "BLOCKS = 9 # size of a block is each dimension of the picture divided by this\n", "NUM_OUTPUT = 1 # how many different images to output\n", "DITHER = False # randomizes the glitch so it looks noisier but less blocky\n", "INTENSITY = 0 # tweaks the probability of line corruption\n", "ROTATION = 0 # defaults to vertical\n", "JPEG = None # save as .jpg if 0 < JPEG < 100\n", "FUZZY_EDGES = False # if True, don't crop the output as much\n", "INTERPOLATION = 0 # for rotation; 0 = bicubic, 1 = bilinear, 2 = nearest\n", "BELL = '' # silent by default\n", "L = [] # empty list\n", "\n", "\n", "def printHelp():\n", " \"\"\"Print the script's usage message, formatted from docstring, and exit.\"\"\"\n", " print(__doc__ % {'interpreter': 'py -3' if system() == 'Windows'\n", " else 'python3',\n", " 'scriptfile': __file__})\n", " sys.exit(64)\n", "\n", "\n", "def openImage(file, resize=1):\n", " \"\"\"Open an image file, and resize it as needed.\n", "\n", " Args:\n", " file (str): the relative path of the image\n", " resize (int): a resize factor for the image's dimensions (default: 1)\n", " Returns:\n", " Image, int, int: an Image object, its width, its height\n", " \"\"\"\n", " try:\n", " image = Image.open(\"pic01.jpg\")\n", " except FileNotFoundError:\n", " print(\"No such file: '\"+file+\"'. Please double-check the command-line \"\n", " \"syntax.\")\n", " sys.exit(66)\n", " # because don't want to manipulate JPEGs directly:\n", " image = image.convert('RGB')\n", " if resize != 1: # makes image smaller for speed\n", " image = image.resize((int(image.size[0]/sqrt(resize)),\n", " int(image.size[1]/sqrt(resize))),\n", " Image.LANCZOS)\n", " width, height = int(image.size[0]), int(image.size[1])\n", " return image, width, height\n", "\n", "\n", "def probability(p):\n", " \"\"\"Determine if a certain event occurs.\n", "\n", " Args:\n", " p (float): the probability of that event\n", " Returns:\n", " bool.\n", " \"\"\"\n", " return True if random() < p else False\n", "\n", "\n", "def partialSort(numList):\n", " \"\"\"Sort a list partially and randomly.\n", "\n", " Args:\n", " numList (list): the list to sort\n", " Returns:\n", " list: the partially sorted list\n", " \"\"\"\n", " ls = list(numList)\n", " a = randrange(len(ls) - 1) # lower bound\n", " b = randrange(a + 1, len(ls)) # upper bound\n", " if probability(0.5):\n", " if probability(0.95):\n", " ls = ls[0:a] + sorted(ls[a:b]) + ls[b:] # middle\n", " else:\n", " ls = sorted(ls[0:b]) + ls[b:] # beginning\n", " else:\n", " if probability(0.95):\n", " ls = ls[0:a] + list(reversed(sorted(ls[a:b]))) + ls[b:] # middle\n", " else:\n", " ls = ls[0:a] + list(reversed(sorted(ls[a:]))) # end\n", " return ls\n", "\n", "\n", "def progress(counter=0, total=None, done=False):\n", " \"\"\"Display a rudimentary progression counter.\n", "\n", " Args:\n", " counter (int): keeps track of progression (default: 0)\n", " total (int): the maximum number of iterations (default: None)\n", " done (bool): whether a task is done or not (default: False)\n", " \"\"\"\n", " if done:\n", " print('.' * 10, \"Done!\", end=\"\")\n", " print(\"\" if not L\n", " else \" \\U0001F60A\\x1B[0m\"\n", " if system() == \"\\x44\\x61\\x72\\x77\\x69\\x6E\"\n", " else \" \\x3A\\x29\\x1B[0m\")\n", " elif total is not None:\n", " print(\"\" if not L else \"\\x1B[\"+str(31+(counter-1) % 6)+\";1m\", end=\"\")\n", " print(counter, \"/\", total) # fraction\n", " else:\n", " out = int((counter/2)/(IMAGE_WIDTH if IMAGE_WIDTH >= IMAGE_HEIGHT\n", " else IMAGE_HEIGHT) * 10)\n", " print(out * '.' + (10 - out) * ' ', end=\"\\r\") # animated dots\n", "\n", "\n", "def pixSort(image, startW=0, startH=0,\n", " endW=IMAGE_WIDTH, endH=IMAGE_HEIGHT, p=0.8):\n", " \"\"\"Glitch a region of an image using a purposefully broken pixel sort.\n", "\n", " Args:\n", " image (Image): an Image object\n", " startW (int): starting W-coordinate of the region (default: 0)\n", " startH (int): starting H-coordinate of the region (default: 0)\n", " endW (int): ending W-coordinate of the region (default: IMAGE_WIDTH)\n", " endH (int): ending H-coordinate of the region (default: IMAGE_HEIGHT)\n", " p (float): the probability of a line being glitched (default: 0.8)\n", " Returns:\n", " Image: the glitched Image object\n", " \"\"\"\n", " for y in range(startH, endH): # for each line of the pic\n", " progress(y)\n", " if probability(p):\n", " line = []\n", " for x in range(startW, endW):\n", " try:\n", " # make list of every pixel RGB value on the line as tuple\n", " line.append(image.getpixel((y, x)))\n", " except IndexError: # if out of bounds of the picture\n", " break\n", " # backup of the line before sort, to unglitch a channel later\n", " originalLine = list(line)\n", " # if we broke out of the previous loop we might get out of bounds\n", " try:\n", " line = partialSort(line)\n", " except ValueError:\n", " pass # My code is bad, and I should feel bad.\n", " # restore one of the original channels at random (looks colourful)\n", " if probability(p * 0.75):\n", " colour = randrange(3) # 0 = R, 1 = G, 2 = B\n", " for px in range(len(line)):\n", " line[px] = ((originalLine[px][0]\n", " if colour == 0 else line[px][0]),\n", " (originalLine[px][1]\n", " if colour == 1 else line[px][1]),\n", " (originalLine[px][2]\n", " if colour == 2 else line[px][2]))\n", " # make the actual changes to the image object\n", " for x in range(len(line)):\n", " try:\n", " image.putpixel((y + (randrange(1, 3)\n", " if probability(0.1) and DITHER\n", " else 1),\n", " startW + x),\n", " (line[x]))\n", " except IndexError: # out of bounds of the picture\n", " break\n", " return image\n", "\n", "\n", "def glitch(image, blocks=9, rotation=0):\n", " \"\"\"Glitch an Image object at a specific angle and intensity.\n", "\n", " Args:\n", " image (Image): an Image object\n", " blocks (int): affects size/intensity of overlapping blocks (default: 9)\n", " rotation (int): an angle of rotation (default: 0)\n", " Returns:\n", " Image: the glitched Image object\n", " \"\"\"\n", " # the script works with overlapping rectangles of the following size:\n", " wBlock, hBlock = int(IMAGE_WIDTH/blocks), int(IMAGE_HEIGHT/blocks)\n", "\n", " # rotate the picture\n", " if rotation != 0:\n", " image = image.rotate(rotation,\n", " resample=(Image.BILINEAR\n", " if INTERPOLATION == 1\n", " else Image.NEAREST\n", " if INTERPOLATION == 2\n", " else Image.BICUBIC),\n", " expand=True)\n", " if rotation == 0 or abs(rotation) == 90: # adds a black border\n", " image = ImageOps.expand(image,\n", " border=(wBlock if wBlock >= hBlock\n", " else hBlock),\n", " fill=0)\n", "\n", " # glitch loop\n", " currentHeight = 0\n", " # the loops continue a bit outside the original image's bounds\n", " # in order to produce the distinctive \"fuzzy edges\" look,\n", " # hence the lengthy conditionals.\n", " while (currentHeight + hBlock * 2/3 <=\n", " (IMAGE_HEIGHT if IMAGE_HEIGHT >= IMAGE_WIDTH\n", " else IMAGE_WIDTH)*2):\n", " currentWidth = 0\n", " while (currentWidth + wBlock * 2/3 <=\n", " (IMAGE_WIDTH if IMAGE_WIDTH >= IMAGE_HEIGHT\n", " else IMAGE_HEIGHT)*2):\n", " image = pixSort(image,\n", " currentHeight,\n", " currentWidth,\n", " currentHeight + hBlock,\n", " currentWidth + wBlock,\n", " # I pulled the following formula out of my a**,\n", " # but empirically it seemed to yield the best\n", " # p values for blocks between 5 and 11.\n", " p=(1 - (blocks**2 / (blocks + 1)**2) **\n", " randrange(blocks - 4 + INTENSITY,\n", " blocks - 1 + INTENSITY)))\n", " currentWidth += int(wBlock * 2/3) if blocks > 1 else wBlock\n", " currentHeight += int(hBlock * 2/3) if blocks > 1 else hBlock\n", "\n", " # undo the rotation\n", " if rotation != 0:\n", " image = image.rotate(-rotation,\n", " resample=(Image.BILINEAR\n", " if INTERPOLATION == 1\n", " else Image.NEAREST\n", " if INTERPOLATION == 2\n", " else Image.BICUBIC),\n", " expand=True)\n", "\n", " return image\n", "\n", "\n", "def main():\n", " \"\"\"Main loop; Open and save the picture file.\"\"\"\n", " try:\n", " iteration = 0\n", " while iteration < NUM_OUTPUT:\n", " progress(iteration + 1, total=NUM_OUTPUT)\n", "\n", " # opening the file and glitching it\n", " im = openImage(FILENAME, RESIZE_FACT)[0]\n", " im = glitch(im, BLOCKS, ROTATION)\n", "\n", " # cropping the image to original size, except if fuzzy edges,\n", " # in which case a black border is left around the picture.\n", " trig = (abs(sin(rad(ROTATION)))\n", " if abs(sin(rad(ROTATION))) > abs(cos(rad(ROTATION)))\n", " else abs(cos(rad(ROTATION)))) # for fuzzy edges\n", " left = int((im.width - # the current image width\n", " IMAGE_WIDTH - # the original image width\n", " (0 if not FUZZY_EDGES\n", " else IMAGE_WIDTH/BLOCKS*trig))/2) # less crop\n", " top = int((im.height -\n", " IMAGE_HEIGHT -\n", " (0 if not FUZZY_EDGES\n", " else IMAGE_HEIGHT/BLOCKS*trig))/2)\n", " right = int(IMAGE_WIDTH +\n", " (im.width -\n", " IMAGE_WIDTH +\n", " (0 if not FUZZY_EDGES\n", " else IMAGE_WIDTH/BLOCKS*trig))/2)\n", " bottom = int(IMAGE_HEIGHT +\n", " (im.height -\n", " IMAGE_HEIGHT +\n", " (0 if not FUZZY_EDGES\n", " else IMAGE_HEIGHT/BLOCKS*trig))/2)\n", " # Pillow uses (left, top, right, bottom) coordinates,\n", " # which define a rectangle region to keep.\n", " im = im.crop(box=(left, top, right, bottom))\n", "\n", " # saving the output\n", " if JPEG is None:\n", " im.save(FILENAME.split('.')[0]+'_out'+str(iteration)+\".png\")\n", " else:\n", " im.save(FILENAME.split('.')[0]+'_out'+str(iteration)+\".jpg\",\n", " optimize=True,\n", " quality=JPEG,\n", " subsampling=0) # see Pillow doc for jpeg options\n", "\n", " iteration += 1\n", " progress(done=True)\n", " print(BELL) # blank line if silent\n", "\n", " except KeyboardInterrupt:\n", " print(\"\\nCancelled.\"+NORM if not L\n", " else \"\\n\\x1B[0m\\U0001F308\"\n", " if system() == \"\\x44\\x61\\x72\\x77\\x69\\x6E\"\n", " else \"\\n\\x3A\\x27\\x28\\x1B[0m\")\n", " sys.exit(70)\n", "\n", "# reading command-line parameters and launching the main loop\n", "if __name__ == \"__main__\":\n", " try:\n", " if sys.argv[1] in ('-h', '--help'):\n", " printHelp()\n", " FILENAME = sys.argv[1]\n", " opts, args = getopt.getopt(sys.argv[2:], # list of valid flags\n", " \"hHVdPfsi:r:b:n:J:a:I:\",\n", " [\"interpol=\", \"fuzzyedges\", \"vertical\",\n", " \"help\", \"blocks=\", \"numoutput=\", \"resize=\",\n", " \"dither\", \"intensity=\", \"horizontal\",\n", " \"angle=\", \"jpeg=\", \"sound\",\n", " \"png\", \"\\x67\\x61\\x79\"])\n", " # IndexError if FILENAME unspecified\n", " except (IndexError, getopt.GetoptError):\n", " printHelp()\n", " for opt, arg in opts:\n", " try:\n", " if opt in ('-h', '--help'): # usage message\n", " printHelp()\n", " elif opt in ('-b', '--blocks'): # affects size & num of glitches\n", " BLOCKS = int(arg)\n", " elif opt in ('-n', '--numoutput'): # number of files generated\n", " NUM_OUTPUT = int(arg)\n", " elif opt in ('-r', '--resize'): # resize each side by sqrt(arg)\n", " RESIZE_FACT = int(arg)\n", " elif opt in ('-d', '--dither'): # effect more noisy, less blocky\n", " DITHER = True\n", " elif opt in ('-i', '--intensity'): # intensity affects probability\n", " INTENSITY = int(arg)\n", " elif opt in ('-H', '--horizontal'): # rotate by 90 degrees\n", " ROTATION = 90\n", " elif opt in ('-V', '--vertical'): # useless by default\n", " ROTATION = 0\n", " elif opt in ('\\x2D\\x2D\\x67\\x61\\x79'): # puts some joy in your life\n", " L.append('')\n", " elif opt in ('-J', '--jpeg'): # output in jpeg with given quality\n", " JPEG = int(arg)\n", " elif opt in ('-P', '--png'): # useless by default\n", " JPEG = None\n", " elif opt in ('-a', '--angle'): # rotation by this angle\n", " ROTATION = int(arg)\n", " elif opt in ('-f', '--fuzzyedges'): # leaves a black frame\n", " FUZZY_EDGES = True\n", " elif opt in ('-I', '--interpol'): # resizing always uses Lanczos!\n", " INTERPOLATION = int(arg)\n", " elif opt in ('-s', '--sound'): # ding!\n", " BELL = '\\a'\n", " except ValueError:\n", " printHelp()\n", " # failsafe for intensity, otherwise yields poor results\n", " INTENSITY = INTENSITY if BLOCKS + INTENSITY >= 3 else 3 - BLOCKS\n", " IMAGE_WIDTH, IMAGE_HEIGHT = openImage(FILENAME, RESIZE_FACT)[1:]\n", " main()\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# let's take a look at it\n", "from IPython.display import Image\n", "Image(filename='-f_out0.png')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This line:\n", "\n", "```\n", " try:\n", " image = Image.open(\"pic01.jpg\")\n", "```\n", "\n", "originally read like this:\n", "\n", "```\n", " try:\n", " image = Image.open(file)\n", "```\n", "\n", "In which case, this code can be its own command line program - we call it from the terminal (which we access from a notebook using `!` and we feed it the filename of the image we want to mess around with). Try it now- run the following codeblock, and then download the results to see what you've got!" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 / 5\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "....... \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "........ \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "......... \r", "..........\r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", " \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ". \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", ".. \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", "... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", ".... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "..... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r", "...... \r" ] }, { "name": "stdout", "output_type": "stream", "text": [ ".......... Done!\n", "2 / 5\n", ".......... Done!\n", "3 / 5\n", ".......... Done!\n", "4 / 5\n", ".......... Done!\n", "5 / 5\n", ".......... Done!\n", "\n" ] } ], "source": [ "!python prismsort.py pic01.jpg -n 5 -r 3 -a 45 -i -2 --fuzzyedges --jpeg 95" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This creates 5 randomly glitched versions of that photo that are 1/3rd the size of the original, with a diagonal pattern at a 45° angle, and a slightly reduced intensity, with fuzzy (feathered) edges, and saves them in JPEG at 95% quality.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Let's take a look at them; the filenames range from pic01_out0.jpg to pic01_out4.jpg.\n", "# rerun or copy the line below with the different file names to display each picture\n", "Image(filename='pic01_out0.jpg')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The parameters that you can call are:\n", "\n", "```\n", "-a, --angle=NUM : rotates the glitch effect by this many degrees\n", " (default: 0, i.e. vertical)\n", "-b, --blocks=NUM : number of blocks (default: 9)\n", " affects the overlapping of the glitch effect\n", " (higher = more intense)\n", "-d, --dither : makes result more noisy, and less blocky\n", "-f, --fuzzyedges : in combination with a rotation, will leave a fuzzy black\n", " border around the image\n", "-h, --help : displays this help message\n", "-H, --horizontal : processes the image horizontally (same as -a 90)\n", "-i, --intensity=NUM : intensity (recommended: -2~2; default: 0)\n", " will not go lower than (3 - number of blocks)\n", "-I, --interpol=NUM : rotation interpolation (default: 0 = bicubic, sharp)\n", " (1 = bilinear, smooth; 2 = nearest, aliased)\n", "-J, --jpeg=NUM : saves as JPEG at the specified quality\n", " (recommended: 75~95)\n", "-n, --numoutput=NUM : number of output files to be generated (default: 1)\n", " the output files are in the format:\n", " _out.\n", " files are overwritten without warning!\n", "-P, --png : saves as PNG (default)\n", "-r, --resize=NUM : resize factor (e.g. 2 divides side by sqrt(2); optional)\n", "-s, --sound : play alert sound when done (silent by default)\n", "-V, --vertical : processes the image vertically (default; same as -a 0) \n", "\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now get glitching!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }