add GlitchImage class, converting to BMP

This commit is contained in:
Luna 2019-06-07 00:35:46 -03:00
parent 0acf870f6c
commit 3b822e4b9a
3 changed files with 40 additions and 8 deletions

View file

@ -4,16 +4,18 @@ import tempfile
import shutil import shutil
from pathlib import Path from pathlib import Path
from PIL import Image
from .utils import load_file_path from .utils import load_file_path
from .error import InterpreterError from .error import InterpreterError
from .image import GlitchImage
class Interpreter: class Interpreter:
"""Interpreter for scritcher instructions/statements.""" """Interpreter for scritcher instructions/statements."""
def __init__(self): def __init__(self):
self.orig_path = None self.orig_path = None
self.loaded_path = None self.img = None
def _cmd_noop(self): def _cmd_noop(self):
pass pass
@ -26,25 +28,35 @@ class Interpreter:
handle, bmp_path = tempfile.mkstemp('.bmp') handle, bmp_path = tempfile.mkstemp('.bmp')
os.close(handle) os.close(handle)
self.loaded_path = Path(bmp_path) self.img = GlitchImage(source_path, Path(bmp_path))
self.img.load()
def _cmd_quicksave(self): def _cmd_quicksave(self):
suffix = self.orig_path.suffix suffix = self.img.original.suffix
name = self.orig_path.name.replace(suffix, '') name = self.img.original.name.replace(suffix, '')
parent_folder = self.orig_path.parents[0] parent_folder = self.orig_path.parents[0]
# we need to search all files that match the pattern NAME_g* # we need to search all files that match the pattern NAME_g*
# then we save on the one _g suffix above it.
# e.g if the original path is "miya.png", we want to search for
# files named "miya_g1.raw", "miya_g2.raw", and then we want to write
# on "miya_g3.raw".
index = 0 index = 0
for glitched_out in parent_folder.glob(f'{name}*'): for glitched_out in parent_folder.glob(f'{name}_g*'):
try: try:
idx = int(glitched_out.name.strip(name + '_g')[0]) idx = int(glitched_out.name.strip(name + '_g')[0])
# glob() doesnt seem to show a stable order. anyways, we can
# just only update our index when its the maximum found
if idx > index:
index = idx index = idx
except (IndexError, ValueError): except (IndexError, ValueError):
continue continue
# create our next glitched path # create our next glitched path
out_path = shutil.copyfile( out_path = shutil.copyfile(
self.loaded_path, parent_folder / f'{name}_g{index + 1}.raw') self.img.path, parent_folder / f'{name}_g{index + 1}.raw')
print('saved to', out_path) print('saved to', out_path)
@ -55,7 +67,7 @@ class Interpreter:
args = shlex.split(line) args = shlex.split(line)
command = args[0] command = args[0]
if command != 'load' and self.loaded_path is None: if command != 'load' and self.img is None:
print('warn: no file loaded.') print('warn: no file loaded.')
try: try:

17
scritcher/image.py Normal file
View file

@ -0,0 +1,17 @@
import logging
from PIL import Image
log = logging.getLogger(__name__)
class GlitchImage:
"""A wrapper class around PIL.Image"""
def __init__(self, orig_path, target_path):
self.original = orig_path
self.path = target_path
def load(self):
"""Load the given image, convert it to BMP, and write it on the
given target path."""
log.info('opening %r into %r', self.original, self.path)
img = Image.open(self.original)
img.save(self.path, 'BMP')

View file

@ -1,9 +1,12 @@
import sys import sys
import logging
from pathlib import Path from pathlib import Path
from .executer import Interpreter from .executer import Interpreter
from .error import InterpreterError from .error import InterpreterError
logging.basicConfig(level=logging.DEBUG)
def main(): def main():
try: try:
scri_path = Path(sys.argv[1]).resolve() scri_path = Path(sys.argv[1]).resolve()