Advertisement
Tyler_Elric

gba_processing.py

Sep 22nd, 2013
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from pygame.image import load as load_image, save as save_image
  2. from pygame.surfarray import array3d, make_surface
  3. from pygame import Surface
  4. from colorsys import rgb_to_hls
  5. from sys import argv
  6. from math import sqrt
  7. from numpy import array
  8.  
  9. formatted_colors = {}
  10. def fmt_color(c):
  11.     rgb = c if isinstance(c,tuple) else color_components(c)
  12.     get_fmt = lambda c:"#{:02X}{:02X}{:02X}".format(*rgb)
  13.     #get_fmt = lambda c:"rgb({},{},{})".format(*rgb)
  14.     if c not in formatted_colors:
  15.         formatted_colors[c] = get_fmt(c)
  16.     return formatted_colors[c]
  17.  
  18. def gba_component(std_component):
  19.     return int(round((((std_component / 255) * 31))) * 8)
  20.  
  21. def gba_filter(c):return tuple(map(gba_component,c))
  22.  
  23. def color_distance(a,b):
  24.     hsl_a, hsl_b = rgb_to_hls(*map(int,a)),rgb_to_hls(*map(int,b))
  25.     return sqrt(sum(map(lambda a,b:((a-b)**2), hsl_a,hsl_b)))
  26.  
  27. def n_to_t(n):return (n[0],n[1],n[2])
  28. def t_to_n(t):return array(t)
  29.  
  30. def process_surface(surf):
  31.     rows = array3d(surf)
  32.     to_swap,color_heat = {},{}
  33.     for row in rows:
  34.         for pixel in row:
  35.             pixel = n_to_t(pixel)
  36.             if pixel in to_swap:
  37.                 color_heat[to_swap[pixel]]-=1
  38.                 continue
  39.             nc = gba_filter(pixel)
  40.             to_swap[pixel] = nc
  41.             color_heat[nc] = -1
  42.     colors = sorted(map(to_swap.get,to_swap.keys()),key=color_heat.get)
  43.     used_colors = colors[:16]
  44.     r_cs = [c for c in to_swap.keys() if to_swap[c] not in used_colors]
  45.     for color in r_cs:
  46.         dist_to = lambda cc:(cc,-1 * color_distance(color,cc))
  47.         color_distances = dict(map(dist_to,used_colors))
  48.         s = sorted(color_distances.keys(),key=color_distances.get)
  49.         to_swap[color] = s[0]
  50.     u_colors = []
  51.     def color(c):
  52.         r=to_swap.get(c,c)
  53.         u_colors.append(r)
  54.         return (r[1],r[0],r[2])
  55.     def column(row):return array([color(n_to_t(c)) for c in row])
  56.     new_things = array([column(row) for row in rows])
  57.     u_colors = set(u_colors)
  58.     print(*map(fmt_color,u_colors),sep='\n')
  59.     return make_surface(new_things)
  60.  
  61. def append_fn(fn,ap):return fn[:fn.find(".")] + ap + fn[fn.find("."):]
  62. def base_fn(fn):return fn[fn.rfind("\\")+1:]
  63.  
  64. for fn in argv[1:]:
  65.     nfn = append_fn(fn,"-processed")
  66.     print(base_fn(fn),":",base_fn(nfn))
  67.     img = load_image(fn)
  68.     new_img,dimensions = process_surface(img), img.get_size()
  69.     new_image = Surface(tuple(map(lambda a,b:a*b,dimensions,[2,1])))
  70.     new_image.blit(img,(0,0))
  71.     new_image.blit(new_img,(img.get_width(),0))
  72.     save_image(new_img, nfn)
  73.     save_image(new_image, append_fn(fn,"-combined"))
  74.     print("="*80)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement