Compare commits

...

3 commits

Author SHA1 Message Date
3b822e4b9a add GlitchImage class, converting to BMP 2019-06-07 00:35:46 -03:00
0acf870f6c finish impl for quicksave 2019-06-07 00:21:27 -03:00
ceb812565f add unfinished impl for quicksave 2019-06-07 00:13:43 -03:00
4 changed files with 70 additions and 4 deletions

View file

@ -1,19 +1,64 @@
import sys
import os
import shlex
import tempfile
import shutil
from pathlib import Path
from PIL import Image
from .utils import load_file_path
from .error import InterpreterError
from .image import GlitchImage
class Interpreter:
"""Interpreter for scritcher instructions/statements."""
def __init__(self):
self.loaded_path = None
self.orig_path = None
self.img = None
def _cmd_noop(self):
pass
def _cmd_load(self, loadpath: str):
path = load_file_path(loadpath)
source_path = load_file_path(loadpath)
self.orig_path = source_path
# create a temporary file to hold bmp data
handle, bmp_path = tempfile.mkstemp('.bmp')
os.close(handle)
self.img = GlitchImage(source_path, Path(bmp_path))
self.img.load()
def _cmd_quicksave(self):
suffix = self.img.original.suffix
name = self.img.original.name.replace(suffix, '')
parent_folder = self.orig_path.parents[0]
# 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
for glitched_out in parent_folder.glob(f'{name}_g*'):
try:
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
except (IndexError, ValueError):
continue
# create our next glitched path
out_path = shutil.copyfile(
self.img.path, parent_folder / f'{name}_g{index + 1}.raw')
print('saved to', out_path)
def run(self, line: str):
"""Run a single line."""
@ -22,7 +67,7 @@ class Interpreter:
args = shlex.split(line)
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.')
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 logging
from pathlib import Path
from .executer import Interpreter
from .error import InterpreterError
logging.basicConfig(level=logging.DEBUG)
def main():
try:
scri_path = Path(sys.argv[1]).resolve()

View file

@ -1,5 +1,6 @@
import sys
from pathlib import Path
from .error import InterpreterError
def load_file_path(arg: str) -> Path: