From 7de3708efae39bafdd8786287f59e7157b29f1ea Mon Sep 17 00:00:00 2001 From: Michael Taboada Date: Tue, 6 Aug 2024 09:41:40 -0700 Subject: [PATCH] Hopefully made this python3 compatible.. Need exhaustive tessting. --- image_util.py | 38 ++++++++++++++++++------------------- image_util.pyc | Bin 25332 -> 0 bytes test.py | 50 ++++++++++++++++++++++++------------------------- test.pyc | Bin 78062 -> 0 bytes test_serve.py | 9 +++++---- 5 files changed, 49 insertions(+), 48 deletions(-) delete mode 100644 image_util.pyc delete mode 100644 test.pyc diff --git a/image_util.py b/image_util.py index 16dbc38..38bd689 100644 --- a/image_util.py +++ b/image_util.py @@ -1,4 +1,4 @@ -from io import StringIO +from io import BytesIO import io import base64 import colorsys @@ -43,7 +43,7 @@ def image_to_binary(image, crush=False): if output == 1: print("failed to crush") s=bson.binary.Binary(open(outfile).read()) - print(time.time()-t_time) + print((time.time()-t_time)) return s else: output = StringIO.StringIO() @@ -69,7 +69,7 @@ def load_image(image_data): image = Image.open(io.BytesIO(byte_data)) except: byte_data = image_data - image = Image.open(io.BytesIO(byte_data)) + image = Image.open(io.BytesIO(base64.b64decode(byte_data, validate=True))) image = image.convert("RGBA") return image @@ -87,9 +87,9 @@ def image_to_bmp_string(img): return base64.b64encode(string) def image_to_string_format(img,format_type, conv="RGB"): - output = StringIO.StringIO() + output = BytesIO() img.convert(conv).save(output, format=format_type) - string = output.getvalue() + string = output.getbuffer() return base64.b64encode(string) def color_byte_to_hex(byte_color): @@ -147,7 +147,7 @@ def rectify_sub(image): # _ # | curr_pixel = BLACK - for i in reversed(range(w)): + for i in reversed(list(range(w))): if i == w-1: continue for j in range(h): @@ -164,7 +164,7 @@ def rectify_sub(image): # # |_ curr_pixel = BLACK - for j in reversed(range(h)): + for j in reversed(list(range(h))): if j == h-1: continue for i in range(w): @@ -181,10 +181,10 @@ def rectify_sub(image): # # curr_pixel = BLACK - for j in reversed(range(h)): + for j in reversed(list(range(h))): if j == h-1: continue - for i in reversed(range(w)): + for i in reversed(list(range(w))): last_pixel = curr_pixel curr_pixel = image.getpixel((i,j)) @@ -258,7 +258,7 @@ def segfill(image, mark_color, target_color): last_red = False - for entry in new_h_range.keys(): + for entry in list(new_h_range.keys()): if entry > 0: new_h_range[entry-1] = 1 new_h_range = sorted(new_h_range.keys()) @@ -348,7 +348,7 @@ def floodfill2(image, center, bg_color): last_marked = [[0,i] for i in range(h)]#center] last_marked2 = list() rounds = 0 - print(time.time()-t) + print((time.time()-t)) a = 0 b = 0 while last_marked: @@ -367,10 +367,10 @@ def floodfill2(image, center, bg_color): ########## #print([chr(x) for x in bytes_array]) - print(time.time()-t) + print((time.time()-t)) print([a,b]) image_out = Image.frombytes(mode, (w,h),"".join([chr(x) for x in bytes_array])) - print(time.time()-t) + print((time.time()-t)) image_out.show() @@ -472,7 +472,7 @@ def reduce_to_multi_color(img, bg, colors_map, threshold): else: tc, tc_map = entry, entry - if isinstance(tc, basestring): + if isinstance(tc, str): tc = color_hex_to_byte(tc) rr = r-tc[0] @@ -601,7 +601,7 @@ def fix_bounding_box(img, bounding_box): w = img.width h = img.height for key in bounding_box: - if isinstance(bounding_box[key], basestring): + if isinstance(bounding_box[key], str): bounding_box[key] = int(bounding_box[key]) if 'w' in bounding_box: if bounding_box['x'] < 0: @@ -718,7 +718,7 @@ def tint_image(image, color, border=2): def black_expand(image, mark_color, target_colors): w = image.width h = image.height - if isinstance(target_colors, basestring): + if isinstance(target_colors, str): target_colors = [target_colors] mark_color = tuple(color_hex_to_byte(mark_color)[0:3]) @@ -755,7 +755,7 @@ def black_expand(image, mark_color, target_colors): if j < h-1 and image.getpixel((i, j+1)) in target_colors: image.putpixel((i,j+1), mark_color) break - print("Black expand took: "+str(time.time()-t_time)) + print(("Black expand took: "+str(time.time()-t_time))) return image def expand_vertical(img, bg_color, target_color): @@ -800,7 +800,7 @@ def expand_vertical(img, bg_color, target_color): upset[j] = 1 for key in upset: image.putpixel((i, key), target) - print("vert expand ", time.time()-t_time) + print(("vert expand ", time.time()-t_time)) return image def expand_horizontal(img, bg_color, target_color): @@ -848,7 +848,7 @@ def expand_horizontal(img, bg_color, target_color): upset[i] = 1 for key in upset: image.putpixel((key, j), target) - print("horizontal expand ", time.time()-t_time) + print(("horizontal expand ", time.time()-t_time)) return image diff --git a/image_util.pyc b/image_util.pyc deleted file mode 100644 index e98cf05263bf6707e7f7ca433b95e2a787aab6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25332 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 0: cropped_pic = person_dict[key] plud['person_dict'][cropped_pic] = { @@ -513,7 +513,7 @@ def main(): } for i, key in enumerate(fail_person_tiles): - print("pp", i,key) + print(("pp", i,key)) if pmapf[i] >= 0: cropped_pic = fail_person_dict[key] plud['person_dict'][cropped_pic] = { @@ -537,7 +537,7 @@ def main(): t = time.time() k, map_data = ParseScreenObstructions.parse_screen(im, tile_info, lud, plud, partial_center=True) - print(time.time()-t) + print((time.time()-t)) import pdb pdb.set_trace() @@ -608,7 +608,7 @@ class PathFinder: path.append((py,px, vy,vx)) py-=vy px-=vx - print("path", path[-1]) + print(("path", path[-1])) path = path[::-1] return path @@ -669,8 +669,8 @@ class PackageOutput: spec = " ".join(sp[:i]) break if spec not in " ".join(mem): - print("spec", spec) - print(" ".join(mem).split()) + print(("spec", spec)) + print((" ".join(mem).split())) specials[spec] = 1 else: sp = entry.split(" ") @@ -684,7 +684,7 @@ class PackageOutput: if not output: output.append("None") if specials: - print("____++", mem) + print(("____++", mem)) output.append("special,") for key in specials: output.append(key+",") @@ -803,7 +803,7 @@ class PackageOutput: if state_dict.get("paused") == 1: if self.pause_mode['active'] is True: output = list() - print(self.pause_mode) + print((self.pause_mode)) if self.pause_mode['active'] is False and clicked.get('start'): self.pause_mode['active'] = True self.pause_mode['goal'] = "menu" @@ -820,7 +820,7 @@ class PackageOutput: elif self.pause_mode['active'] and state_dict.get("start") and self.pause_mode['goal'] != "menu": pass elif self.pause_mode['active'] and not state_dict.get("start") and self.pause_mode['goal'] != "menu": - print(self.pause_mode['goal']) + print((self.pause_mode['goal'])) press_output = ["unpause"] elif self.pause_mode['active'] and self.pause_mode['total'] > 0: if state_dict.get("a"):#clicked.get("a"): @@ -860,7 +860,7 @@ class PackageOutput: break if path_data and x is not None and y is not None: path = PathFinder.find_path(path_data, 6-y,7+x) - print("X Y ",x,y,target, num, goal) + print(("X Y ",x,y,target, num, goal)) if path: vy = -1*path[0][2] vx = path[0][3] @@ -873,7 +873,7 @@ class PackageOutput: press_output.append("left") elif vx > 0: press_output.append("right") - print("AAAA ", map_data['tiles'][6-vy][7+vx]['type'], target) + print(("AAAA ", map_data['tiles'][6-vy][7+vx]['type'], target)) if map_data['tiles'][6-vy][7+vx]['type'] == target.replace(",", "").strip(): press_output.append("a") output = list() @@ -915,7 +915,7 @@ def main_b(): t = time.time() k, map_data = ParseScreenObstructions.parse_screen(im, tile_info, lud, plud, partial_center=True) - print( time.time()-t) + print(( time.time()-t)) import pdb pdb.set_trace() @@ -924,9 +924,9 @@ def main_c(): for i in range(10): im = Image.open("maps_"+str(2+i)+".png") t = time.time() - print ("--", po.memory) - print (po.run(im)) - print (time.time()-t) + print(("--", po.memory)) + print((po.run(im))) + print((time.time()-t)) import pdb pdb.set_trace() @@ -1052,7 +1052,7 @@ class ParseScreenObstructions: east_obs = i-8; for j, doc in enumerate(results['vertical']): - if doc and j != 6 and doc['obs']%2 == 1: + if doc and j != 6 and doc['obs']%2 == 1: if j < 6: north_obs = 5-j; if j > 6 and south_obs == None: @@ -1165,11 +1165,11 @@ class ParseScreenText: ch = seen[k] im.paste(load_image(ch), (c*8, 0)) - kk = found_tiles.keys() + kk = list(found_tiles.keys()) stra = [x for x in " >>ABCDEFGHIJ KLMNOPQRSTUVWXYZ',.123456789abcdefghijklmnopqrstuvwxyz-"] stra.extend(["..", "!", "?", " "," "," "," "," "," "," "," ",">",">"," "," ", "Mail", "Rod", " ", "Sword", " ", " "," "," "," "," "," ","Nunchucks", " ", " ","Hammer", " ", " ", " ", "Level", "/", "Weapon", " ", " ", " ", " ", "Status", " ", " ", " ", " ", " ", " ", ">", ">", " ", "E", ">", ">", "Fight", " ", " ", " "," ", " ", "Magic", " ", " ", " ", "Drink", " ", " ", " "]) output_dict = OrderedDict() - kk2 = [seen[x] for x in seen.keys()] + kk2 = [seen[x] for x in list(seen.keys())] for i, ch in enumerate(kk2): subi = load_image(ch) new_subi = reduce_to_colors(subi.convert("P", palette=Image.ADAPTIVE), ["FFFFFF"], 32) @@ -1267,7 +1267,7 @@ class TileTools: return ress[0][0:2] def to_image_key(img): - if isinstance(img, basestring): + if isinstance(img, str): img = load_image(img) key = image_to_string_format(img, "BMP") return key @@ -1314,11 +1314,11 @@ class ScreenSelector: #images have different bmp headers sometimes, so reformat them here. new_dict = dict() - for key, val in cls.luds['plud']['person_dict'].items(): + for key, val in list(cls.luds['plud']['person_dict'].items()): new_dict[image_to_string_format(load_image(key),"BMP")] = val cls.luds['plud']['person_dict'] = new_dict new_dict = dict() - for key, val in cls.luds['lud'].items(): + for key, val in list(cls.luds['lud'].items()): new_dict[image_to_string_format(load_image(key), "BMP")] = val cls.luds['lud'] = new_dict @@ -2159,9 +2159,9 @@ def main2(): im = load_image(image['image_data']) t = time.time() tex = ParseScreenText.parse_screen(im, f) - print (time.time()-t) + print((time.time()-t)) for coord, line in tex: - print(coord, line) + print((coord, line)) if tex: import pdb pdb.set_trace() @@ -2351,8 +2351,8 @@ def test_person(): po = PackageOutput("ff1_data.lud", "enemy_lookup.dat") import pdb pdb.set_trace() - print ("--", po.memory) - print (po.run(im, {"paused": 1})) + print(("--", po.memory)) + print((po.run(im, {"paused": 1}))) if __name__=='__main__': diff --git a/test.pyc b/test.pyc deleted file mode 100644 index 95d0a058809aebe89ff995eab25df3991d3a501e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78062 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", " ").split(" ") nw = list() for idx, word in enumerate(words): @@ -88,7 +89,7 @@ class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): self.send_response(200) self.send_header("Content-type", "text/html") output = json.dumps(res) - print(len(output), time.time()-t_time) + print((len(output), time.time()-t_time)) self.send_header("Content-Length", len(output)) self.end_headers() self.wfile.write(output) @@ -97,7 +98,7 @@ class MainHandler(BaseHTTPServer.BaseHTTPRequestHandler): def main(): host = "localhost" port = 4404 - server_class = BaseHTTPServer.HTTPServer + server_class = HTTPServer httpd = server_class((host, port), MainHandler) try: httpd.serve_forever()