From 8e13939914e036a0646f9fb2b40dd9e5ff63f8ea Mon Sep 17 00:00:00 2001 From: Chris Mounce Date: Tue, 12 Nov 2024 07:33:14 -0800 Subject: [PATCH] Pre-quantize the corpus --- corpus/donsol for pico-8 v1 8 4 _2.png | Bin 0 -> 3970 bytes corpus/quantized/age of ants_2.png | Bin 0 -> 2571 bytes corpus/quantized/age of ants_5.png | Bin 0 -> 2393 bytes corpus/quantized/age_of_ants-title.png | Bin 0 -> 4459 bytes corpus/quantized/build a jetpack_0.png | Bin 0 -> 1258 bytes corpus/quantized/build a jetpack_5.png | Bin 0 -> 1309 bytes corpus/quantized/build a jetpack_9.png | Bin 0 -> 1560 bytes .../donsol for pico-8 v1 8 4 _2.png | Bin 0 -> 919 bytes corpus/quantized/floodedcaves_0.png | Bin 0 -> 2480 bytes corpus/quantized/hersheys_train_line_0.png | Bin 0 -> 2299 bytes corpus/quantized/iso_ray-09_000.png | Bin 0 -> 3152 bytes corpus/quantized/pico20068.png | Bin 0 -> 1989 bytes corpus/quantized/pico8_build_a_jetpack-1.png | Bin 0 -> 1650 bytes corpus/quantized/pico8_bunnysurvivor-9.png | Bin 0 -> 1825 bytes corpus/quantized/pico8_donsol8_v1-14.png | Bin 0 -> 936 bytes corpus/quantized/pico8_mot_raymarch3-0.png | Bin 0 -> 4621 bytes corpus/quantized/pico8_ppwr-5.png | Bin 0 -> 2057 bytes corpus/quantized/pico8_px9-9.png | Bin 0 -> 1542 bytes .../quantized/pico8_rotslimepires_1_1-0.png | Bin 0 -> 4002 bytes corpus/quantized/pico8_witchcrafttd-6.png | Bin 0 -> 1863 bytes corpus/quantized/shinkansen 1 3_1.png | Bin 0 -> 1023 bytes .../storming the grandmothership_1.png | Bin 0 -> 1639 bytes python/quantize.ipynb | 61 ++++++++++++++ python/util.py | 76 ++++++++++++++++++ 24 files changed, 137 insertions(+) create mode 100644 corpus/donsol for pico-8 v1 8 4 _2.png create mode 100644 corpus/quantized/age of ants_2.png create mode 100644 corpus/quantized/age of ants_5.png create mode 100644 corpus/quantized/age_of_ants-title.png create mode 100644 corpus/quantized/build a jetpack_0.png create mode 100644 corpus/quantized/build a jetpack_5.png create mode 100644 corpus/quantized/build a jetpack_9.png create mode 100644 corpus/quantized/donsol for pico-8 v1 8 4 _2.png create mode 100644 corpus/quantized/floodedcaves_0.png create mode 100644 corpus/quantized/hersheys_train_line_0.png create mode 100644 corpus/quantized/iso_ray-09_000.png create mode 100644 corpus/quantized/pico20068.png create mode 100644 corpus/quantized/pico8_build_a_jetpack-1.png create mode 100644 corpus/quantized/pico8_bunnysurvivor-9.png create mode 100644 corpus/quantized/pico8_donsol8_v1-14.png create mode 100644 corpus/quantized/pico8_mot_raymarch3-0.png create mode 100644 corpus/quantized/pico8_ppwr-5.png create mode 100644 corpus/quantized/pico8_px9-9.png create mode 100644 corpus/quantized/pico8_rotslimepires_1_1-0.png create mode 100644 corpus/quantized/pico8_witchcrafttd-6.png create mode 100644 corpus/quantized/shinkansen 1 3_1.png create mode 100644 corpus/quantized/storming the grandmothership_1.png create mode 100644 python/quantize.ipynb create mode 100644 python/util.py diff --git a/corpus/donsol for pico-8 v1 8 4 _2.png b/corpus/donsol for pico-8 v1 8 4 _2.png new file mode 100644 index 0000000000000000000000000000000000000000..b01a3ff10dc2001f701296f3bc98981fd51b2b05 GIT binary patch literal 3970 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 literal 0 HcmV?d00001 diff --git a/corpus/quantized/age of ants_5.png b/corpus/quantized/age of ants_5.png new file mode 100644 index 0000000000000000000000000000000000000000..6cfc3db7056db3537fd52f4c2d9c93de989a0e0f GIT binary patch literal 2393 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 literal 0 HcmV?d00001 diff --git a/corpus/quantized/build a jetpack_0.png b/corpus/quantized/build a jetpack_0.png new file mode 100644 index 0000000000000000000000000000000000000000..378c7ab64afc69eb00a4cc9bd91c202de78f23cd GIT binary patch literal 1258 zcmV5gQ7{`6fH4=5*9tN{1rI+M8v>0;E!J{pB(80QEGRk~zVBj5ENTE;< zI_PovG;JY}i*_gsdYM1N9?5q7rs%Qab}x?`lg9Bce@V|@dMtyqi?PuXV6_F1zpkKl zA3zg~Qs@J^oe_@!4*rfzrx6@FfRP~xM#tdq000Or1@PMje|7kIL?QreYAN6X455I( zBV0nU2@au-tyW<09vBG~0uW6%3t#BjPB>93NTR!B6#PjThYATeU=hdr3JK`I`;5hL zE5MvFcHagt^w@mZ0^kwTQ{4YAdg0=tofqur>Y|kwCgHa$%_fw+u!z4!7n}HfS%U05?nmD5r8D6Q9JvY$j6rb2~1yV1d6I+n? z0a7F3O=z6Tr3R4kY5=RQKtpX=!b$+EF5yo(ssD+*a@IvB)px_76yiUr!z>mxi zq2*>%?|~@Ydt@d6^JR+ z-!IJ|)FzHYvL&q=l|B$tsJH*QID^o8x&yPa6^scMfgyV)F&8`Mj}x*U95n+Jrcg`# zrpeCZpCI8Fy?==pOvZl1k9LYf05UIJvgkUxwn?B^>~ny`3zzfD>j)~U51*O<w7&g!07$)s0_YB#s0iq~&z zcTfD-SSG+)4xmmwY#jyEtw#-@>H|995x6eA;Oz3Vo`MYEo(u+nap9~92nOQTl>x4h z@B|pN0i5ujfU_o`5RSX&Y)M98DFCvjlm|Tr9;S8jpjw(J9;W4hYH3n?mq#UDnK?^{ukZM4G`c_D_8A;v1_-atZaZS53jXW&`@P#_JwfY^TL_;WaXFwB1R{Zw2sxB}2d(v3610pwKy5M))}2)f!Iirc;6##aFF4~?fj zNH)%rCKLgsO51}jO4|74DjOjFHA?a^;hk6mbZa$UHjLfu<5D4507w#~LHr|t-+Lkv UdX_AZ*XNP)YxfsamzoGBl@y8v1h$1gTljhNu$#-|3d&hfUo_w^p zp;?~+9|B-$)*Ntk5TG$Q@QhzxF5zeb2rNOc4lFza03aGg0DW8ddw`z-UjpE|Q3M!( zB_hBxjv+J~0<-WA1R@FnSYBQ?8bW;guUgN7DWGwSPY4kDgz#7kQV(A=)5Bm)$2``8 z&;#URtO>s4^?C>=g!vGK(85(94H5|xnqTuvUZ)4&V{8Udr~t@E00anF*6P9Md_99G z1i(rHUOUp#UNHC3TnBJ9)_ELLWm+w<;G7XF^z=hr?8nGAc}l#LPCFk z08V4hHK2p>{s3M~<&cr{1|bvym>yv>Kv4_L03}-R_t8QIXsLxVKqD<^fHqpl0ByC9 z0$OT;gv1wsmRbnufX0A!Hkf%cZU6{F#+XS2n5;$s4i99R@ofQNG~`ARDAQ7@>r!k?iK7i9l&t8QkxJmQ-F`zbUJ0z zUXM+W;qw?i^MIK)jf~-DiW)%-IEIrRAwcv2vWc^ zfWN2(V0M-PSg$AGwL{RRMV|!$uLJmh4L8}9o&iq){(UYF3Z_qEHM|nA%T#zPfNCEK zFe4t>U9k>8$J8?cFmL9KcUG*6fXQcy0f6&e&x2Y3?sA7aE7nE8H_?Dn+8zMYNa
YSTtu7Iidkko8@~^$_fDI2-Y50 z<^Yj&k`{HL(;K;U8$B3|`_U!^yz5}+2LkRKI)~jc z-(YUr_QU0ymz^N6(eB;d+8z0F(MEv%CKiTVKe9RSj4+wP&=kuMi* z9D)h}awp!>m35&;pWxqLUqM;yyl2~;q!NMB0-&P+5_|YE1K0`xO$D^F{|Mk;h%O*o TYeX(-00000NkvXXu0mjfdjLDY literal 0 HcmV?d00001 diff --git a/corpus/quantized/build a jetpack_9.png b/corpus/quantized/build a jetpack_9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b22c6e05b811bb9332ef9d3ad158502a498b4d GIT binary patch literal 1560 zcmV+z2Iu*SP)ZbhymQ#7-SN zW$4o478hPK)LU?47RzXW2B3gA!EMygn>zV#=zAn3(>5tlN>Oy^bL<$B_0to{_vs_$ zF^H5k3XUJ%`fJ^gr$s=r-P2DNDJ?z(WAFT>=8GEdV4`W{^bP z$lQvu`w&3Ak~Uz()(a_KL3JXwqZ)};01WqX04oQi<+-f^ zHa*~_N|EbA@UFVM`3>*u($qmQ4X7lPqfk zF5Xy;P>)ax_)>t$^mdw`q#PgyQY_D`Wx&)Wlt-ZlaG-1h`CqiaZT0bm9ze^tRS(Q- z4e4AD9sv+~fO!O?ky*8hFtw)A1N>ZO7TwgcHEfi6AnKZsasW4tD5VFgtjog)PZU)YaowY4;tSWIQ;R)0+gs`%^XUG-79LLsY~P73!)|)0%R@VXG4JW2Wu&**_4_; zh-0UU*aj$nAjZ*L=rWE+7>-k0MQj0-KM?1hO(VHta9!T%Jg8@X6suT=|PaK z6Vm*FGaz}09tIj9_Xo}s&x2EK_M-a(XFxIiff1_v16xCHN79YD19T%;CE9!;IddkE z#1BM;`1*X|+1Weak$@2X6V{n#_melZ01T^Z6EHd()yW`(3OU#HVEJ+Mwgw;&72@l9 z5M&iTb0b7A06^1&Dw}Ac_@W8!UDgk7M&B7vz*)$SdJg{J+u5bDqjK2Pzy*2=NNPk?p%@@qU*>g%CwSKS|Q@S(#PkeVkK9Dv5 z&%Spi@M0)y-I$!6edTyOo_4Y051!Tl82!Q1H}6~lW`9sUi7kRNlRrqRCb64biEMHGdz8nrsy6FmFB!s97(B=!vhfa9dsSQ}`!NKWO=+_WK8JZq|{j2W~bUhIE zuMr^E1GInj0srg4e@+jY#J}-;p%P$yzR;@&*y_ebZ!rcRTov~9gT*);1ELaOTR-S6 zE>^3fUM0Y`ey|vxfCc_!QTlKV=4|Z`=4v?%{@CZQ-h&1HlO#j9)2~-p)KUE&Zo@gs zh8~F3C{L`2El&1+fy2r1-Z5kToT>*Xu?CzczY*Sp~Ulv7sFTY>FVGLWPblVxswZ2_?cn!`~5FqTh@(U z4ziDh9xU5A@AqJULI=cz%&tOfWjDPXvBUx*t9aNKoj(vQ5M2Sopnz&6r-86lu}zR+H;W#MVYq4+Vhwc62^J8&PtZG=P-Awkgw z3ee60hn+Ezj2!?`0F0o}gC*IH!<{XL2ns#e1vo`ejKt;u#{LG5pvFRJ!oi*Z0000< KMNUMnLSTaFJJUS? literal 0 HcmV?d00001 diff --git a/corpus/quantized/donsol for pico-8 v1 8 4 _2.png b/corpus/quantized/donsol for pico-8 v1 8 4 _2.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a5cc99608ef6acf7a708fcb2afea537889444c GIT binary patch literal 919 zcmV;I18Dq-P)Op0Q+_2=0EbauS5Lyj$N%x@t5P=q08Rg+0RQYK0OU3)t^fabsDpN#={D*D0009b zNklYu06#12at9J@=0v>=B;1?Up8ukiy1}_S@ zc27Vys~`qHVmWxCM4%XfpxNo%?R=16ui(ur_y{&>FM#EnaN0s(R{|pmtnBZdmjpJO zg~J4`CS;M=(eY2iyQG}eJOL(I%;}y#F}GtXgEj){O7I~ww-aDD=ec`eXjeePBMF!w%1g2!;$ z5r{ZYyM2-7+*9C+= zO7NXct`P9jCb#47!QuI$Gd`WM@vu$T!<6y)%-ulXmaBsBomNFYySFF^w+-Rc-%Q}6 t1Q)KCHSo=YJN!CzbaZrdbaZ?RKLI;!UEkkKVjTbg002ovPDHLkV1f~Sklz3R literal 0 HcmV?d00001 diff --git a/corpus/quantized/floodedcaves_0.png b/corpus/quantized/floodedcaves_0.png new file mode 100644 index 0000000000000000000000000000000000000000..eef9ce49b92969b1741890dc564e486e27ac3b69 GIT binary patch literal 2480 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 a5Hb9~sk6DX*g^4&0h}G(_Y~O&B>WF15{ifb literal 0 HcmV?d00001 diff --git a/corpus/quantized/iso_ray-09_000.png b/corpus/quantized/iso_ray-09_000.png new file mode 100644 index 0000000000000000000000000000000000000000..c52958f8d04426b2f4f3b941bd543c1a95331d81 GIT binary patch literal 3152 zcmV-W46pNvP))b zQ5apJS6)y2WoF1OKACn_D`hD%G9q5QCu6MLG?S%cGr#=uPtJQ&6Z&hxpBEa=IC;g>

d+_XoviELdp^oTZRm)v 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 X8N4=ms5Rox00000NkvXXu0mjfP}!^t literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_build_a_jetpack-1.png b/corpus/quantized/pico8_build_a_jetpack-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6bc3e4bd03833f4a882e032fcc05dba59b9a6e3 GIT binary patch literal 1650 zcmV-&295cNP)mk8J)12SOG070dzf5$C_Y#h{}Js% z4+;(B(nEyvKQx8yfSE#iY>57e;=A`fX?|%m8jq90F1r;ou}9MTyzhJZG2;oz?pVlw z9U%U3K#u?eT~Z-3k;rcmAwgS8-BqL-%-or@-a6Jh1{Fg2! zrPRV4YN-@n;<;Qb7kvRzs<%qMl}awpPZsu+%Y}N|7eI&_C`g|o%d;OB>eW59JR?hW zKIjS1`bJsZ8R}Mp_n<#psTwd*54Sf6d9AI&rVP0Dj7yw}R7OjDD*R_z|6(DX2fE_O1 z?fU|7Q>->MA##Ff0iP81YO@fH=M_;BoFf zAR`Pg{Q*Er*RwVe#LrP;d|A;Bpj85ChBr&9BE%mM!g0}XJWKpINTafD4;B>wp0e_` zV@C|h>#7!~03a#lSHfmR_YyFxxA=fspVD0}JO?yd>VU^yWm2NRBWZ7`13dd$5eeyP zwjp$v4S?hu0e&9_3kf%wLh10Qhg}`I0Y7ujA4c)RVfdcceQ*3rsdrBqi#xh(1SrlJ zqqhb~bNByq;x-fbSNcXF~|gWJ2`-sMGm*K4-onX#-)53@gqpZuYMN` zXtRcGWIw{t(f8yD0u=XrXC7c)RDy8~_T$yT6V3s0h^gRB({K_&J!28rkK>rqCtPw& z1%K8H0DB+`Sg*gb6$U{mKYD#1A~}51l#tpD#di+jk3s(d>WFE?)i3v@9Lf_;eRB_h zsf#1yJhp&G2Jm_)6`xRdpwk+l;DPh?Ivz8d1p_!z97Yk(2^;xCK^*(3alSU{jRaZ% zjtn5)_mk*OfM{HpS_uun`s+r(s#K4h*Z}hKZZc+LZ&{Ig1PuU-8USo;2H}pv2fAXl z7{H!BIy|xV=Wl*9b^G0bF>@p^1{2W&B%fGnH{gId65!<0NPx*~sg!mCC~Hc9g>ZuQ zZ+INp$xXw6l+wtR5Md0aKm@T#3#0o%KsGG^tO9XE;M`OiiL?t)#1K~?Zpy?6G7jP} zKu}+T-4iGIu;K!(4`uTQM?(TEt%Hh(350#F6Chl`sy?DIx(D+p9t8o77{+BRAe>-316r=5YF>kLOdcE&(z*aCP6cZjuZr+vGx`yH zK>!_X08qB7jU=eYyqP~NHnG%ymHPJuh~c0%5JmJR0~iI^`+H(TLIJRwngKu#m_dw$ z`?I*^&NQWajMe5HLaZ@nvUz`O0SLMm720k3%mA1$P=M)lIlSBr0n+JSF>h&P=Z`t! z(X`6nZk7|;0Ai1_LVMwxF&n<|KitKqu4f@YCZ>Pp3m=D&;v#m#-@QcdIt;+sNDZR| znDBG?nX%NvAOM%7S$X;7#lf4F=`#TRN$X$|F@}8Q*aSpYeKq{ML;YFj51*|7lt6LT zBf#X+vCl3a=+6&!I{+vlDgYSE$bGiD)Vi1k0RTvdaP|UV+FU(Y9(*pp2A)(wLNWEH zjn#u?SUr7*-mOpV2-wNf^`DZ^vocDs+3PUw0+=kswaK$Bz|Muu0>XgQX0It=p7sS~ z?&P}#01%!z)NKRsOKJcPV@tps0gkXO0Vx1bK=s~u%Xg|GP1AY)>iK4SKx$qL=I^QV wH`QAK%AZEJRZzW~y>$-!@*VIU@J#@J1Dw>nVjWh9rT_o{07*qoM6N<$f}us_r2qf` literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_bunnysurvivor-9.png b/corpus/quantized/pico8_bunnysurvivor-9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebdb28ab1dce3b67b2cf9e91f22b51a37dc4297 GIT binary patch literal 1825 zcmV++2j2LJP)wqtAmzD0<^V3C1_DeXz_t(gli-*F(gVsSZ08QhC=iSakWoO+3~YOVtblBG zK(EO+0MZ9s3Aod*>H+gnxC;1N{x?AUcR+@LXczrY@~;3U=##t#n6eBQsLSA7;8hJ! zojLV2gur(G4FJT-SO)bqkoWVi1l;Sg0s_=-r3nS9rHlhX6DFY>U4_~j!gq57WargT zTR{wXT?92mS|DlwHMJ;CDG*5uUk@^WZc!Ap2KDA?2*`Ti6i=S0vI>$_Zg)ZeOaLIW zO;$K5Y5N!e6248PKod9(PY?@a1h6RtWRQTD!I2NB`DbWeDB4jjqk5{#a6mXWmVgJ4 zr-8`aIh2PZ`IfLwUMN^>}m zQ#jN=j|<#}@vl!~@q&F|>~?G~Q9%CaGJwGC>Rf0vqI>DMctBFPPiB+=YsU7HEQ&Ll z0(p&=F%&`|#VH8_&?3}TjFgbBg$2}SaPUiV1E(-f(@1<2fN$!;g%szUdMUV-WVC`c zIac!yG;k)5rF`%p1iYQVGV%{)3ls)WeNd}+jGKTr5~S|MkJt3P(F;EMu^vOhsQ z-iZ@#DgfYlddmQ(Y5KZa$0~(zCn7*?0}NG51kvjZ@v z+{i_@Iyw)?5O7k^(UoK!rvpK}$v^{n6tMASqffdt{=WGXBDZG%e!fJ3?@A!ozr(04 z!2*l||F9C+6DEZkz@D-OIDth?y9n50j4fG!!5<2Y4Z!sGYQV%BV66gRC$2R5^A`hB z14s+}$=GUmRknbx;j@h|Y!tM>9zywVn~lhQVQc`C!sqmkO+ZJjX`rk?1p_c_j)qNo zXJVyLl<~~k2++s}b$`B1?~M>~DFCDc{EO-en-6Y|5W())c>MwcjCsJY|26=iRr9ui z=?Ve#Xn26>V>P9mmR4gW0x$>IaJ#{(Y4Z+9V?YA|s7y02jR8vzU_LN3Z&9&Qji{ywC(CHsR{yZSerGSBrDg6C%5CFa2dXoa_s=$C<%Efmtf7o$=Zo>E1u8{;(30GF%Nb;U8V)1V0 z>P`a#u!Iz7@2`>sY!Qo{PA3A;_;4A^6c*oi?)iXjg4@LKo4bu=o-FgWI0T?EWIz#N7P0RTLru#tX1KqnEjj3EFu(WC&22#+XiWF8PM1V9R=g8-NZ z1OhO%h8RFqwEWwRtGaVLSzY5dSg3zk@jSo&Gv_ zu01Bdk&3QL@Bo;k)O1xV5YnQ7=c3VcMT`J9DN8!N3u&cEsp+mG_!U@yLCTU&1sNPl zSSdAKl>qFpk(#dFhrw=TNp}eW4-uIuq^7G9@P`so(^ajoXNK`KPVdU^C-|HTVbjc< ziI#p(Q1As0`G{Pg;7s-Si5s7=rB?~0PuS95(1n68c*sZO0%wQuG~U0QPZNCh1D<6@ zq&GkzF@KprUw82XpFZMpL-He2LCpY9cO)=-0!#!XbrY!KGRFI{mT&Z#KrNf}%4h_* zO0Swg-HQ{=EHeKJLaGMDwHk!c2~fzr338rm^Ig8Ht_L0Cv0`B$rw1h_Khj{a2pP7R zGUm}>@Dm$H&k^pPYu-HPSU0pR_ue@Vga3BZ9PF80_{T60=bTNtCczAFA5D0Mw#;n7 zk>K7%U6a6uqG9K!BrJk^kTOjI*b@vqXeS83xvyzFLlAJs69m&JbgvNHv6Eo3G~aH| zQJ~*VOgbu1`}5<)W_j*C7J@hvlWwZ7BQpmA2g6q=>mV)!q};bnIu{t`GQnU6=SVsd z&H_I|&MrD|oVf(~h9Wy#d$(fU(#(1cssWj?elj zjj5f|ww@g<MkelWCLQ&3ID(UtF7O1u)K!&Hsh9F{Z z0ox!QAg&IWSrFS-2)K2+G7Ipq1wrXxYk^<8krQ0zs(tXmyYK`2sHNJgGnLH%0000< KMNUMnLSTX}Dz2~q literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_mot_raymarch3-0.png b/corpus/quantized/pico8_mot_raymarch3-0.png new file mode 100644 index 0000000000000000000000000000000000000000..e09e838528f7d7e767f5430aae9877cc055d4a37 GIT binary patch literal 4621 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 literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_px9-9.png b/corpus/quantized/pico8_px9-9.png new file mode 100644 index 0000000000000000000000000000000000000000..3699ed23e4bfda54ea62c5105e5187b41c7f34c5 GIT binary patch literal 1542 zcmV+h2Ko7kP)q#6C(XROuAdY}2e?>s%r zTbhv|5kvV6>Ck^NE@k26$-|t0hWcX&mnBeulR5xe@+AtZ05w4ptq3&$$mL6!cgdCY zUj@OEU;vg}?lLLWt_dpFl3)T*R;-z?EJ&m+mIM=!R+_Edc3$sN2R`z%bE$)en#i zwKYjUKyGbs0Lo7K0Qgkc!2>xJRDX5^s5!Mn2_H{AO33HbFq;f60Q;|sP@Ge?1PNd) zs3cf(%Aw$j1;MmZLhVo%fGf7G0c1(Gd<}pC08m*&VNO{DPYDRBO(@Q(GQm>@s=jM$8Z%|QtpwC>zT3kB;KO!N%r{JEtDqWi-Ah4UgSTP^p%dWu>`VywtPFT-JkL(R zi|^IR{%W!}0l?&52KcuT@Q+ZiuK);5Q1AfVi_Y0=0r;R;ferZcDICUh#Tl#hY6SP} zjnG{MI5`mljyV92&;Yv?&@o;?`Uj(c{c!XDJ;NZLFsx- z*N1oUJ3Jj03ZDhR=OK?a0J5Md0O;YshYAP0)DYGW!tm@O3{UC1bpTjAT`U$Ujxk>Q zvAp9bRDkmzIpBUcYXA^JaO{%|0Lq_X{OQ42^vy+ha&j=M1f=|jZ~y@SKPmw-&Z6i- z8es!|mVkv=UZfHYILZKF6y4_^GaK;7V^slP{%?{;oUhL%e02cFBLff@6v*X&drC|~ zSdN)lfdr(y^2F;lCeZ5{plg7A{!V}x$5KJu6F?LI_f;Ss zG#~E*AiNR#1E7GIcT<0WFkm+TRwne_M!XwGKgy8r+H07*qoM6N<$f?ndAd;kCd literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_rotslimepires_1_1-0.png b/corpus/quantized/pico8_rotslimepires_1_1-0.png new file mode 100644 index 0000000000000000000000000000000000000000..62ed0fe56de67f8593658cfe2ecf16d5f2dfea34 GIT binary patch literal 4002 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 IM6N<$f*16FkpKVy literal 0 HcmV?d00001 diff --git a/corpus/quantized/pico8_witchcrafttd-6.png b/corpus/quantized/pico8_witchcrafttd-6.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa2e4ca2d645296ee7646e5770f9f78d5b1a6d5 GIT binary patch literal 1863 zcmV-N2e|l&P)|?SCsEL3c#(eMuoe=HQtB}0e~q=h;jh+wi_7$eeLMc zouUK{5Q?E*7Aym}T4Wl(4d5o8`j;7z%c3X)INlt9$l^$!)1Qt8AfgCxOMt=vDFAZl zS(1o=$OMS|a{?q&Seiz7TPy%@s;dY9;4Os60Fn6^ElR7%LJ%&^x=Zio01@7aatdq& z1Vk>D9){w&FdPEl4rYfH0i_gR)dC=Lm3$Z7NdZ7fR%9m8M!*pb080TXuUbJ3K~Ndz z073&W2`M05M#XGo05<`+i2@7=y!Z2|D-enRSJ$r66Gi)+M~Q2eO5gVrf~!_9dPf?- zQh>|$qpU7c|E`bL=P5ubhpE#fHvtG9MakL#_aOLmpZlqm04z-alvG4MECt}maV&%Z z=;r`x4GW_V9hx$s?kfNIP~0s7DlMCG75k+a?eK0fggO3M;=%jDHIUFv1$grSo>6|@ zLF~s5Z$cKj)dJiiARC^qUwaVb0hR!Y0K=HL`7j6Q7yMmn9HI)qgg+bv{zoq$i(Q*P zPNGnh(2T7%`-9Ow8_MDR&>u127XX9*>hp2l3Ac`1kSi z27vK6BgFB2sf+;OXaT?~0UpuyiV1+n;q3(gOEx>-FY0mr)lSczGDIGId1Ke?m;;BO-kK$poXPQfnb zL1ppqM*v(tS&y-*Tj>67nLvPuB_Tip$K#NuVFd=BobU->kNJAU+B@6q!rl+t6-m?p zP`{f2AOlxmF>1gz+uO4P(mGdl2mlH}&mwkq+$h@@z<-Yw0qFsUY)q2~GPD2$%y>*Y zZM*%A4S<$)RmuQP1*K3(s-qbKJOG4ydp;Xk0GVM7M^`C=l|ykR@1FzU*@@~=PI;&CbS%TLbb6pL}=Oah>FHLU0YWV7#v;6su8OQ)Z4sZtv>cG`yHUB#>0mEGQFGHwZ zQqZgW=R<1{SR_bIn0fltSq)%*B|yHs14&eIRQoFlLq8vbOl_vl&0!5e*HKPFCnLNF znR`sIM%V8ear_=oxAcV+@PU(^6fIH|H`u&0cKtO>(%HNMOBgHU=4g%DLmwT`%qC>5iE{dyYv23OQHY+bfL~Jeq zP*>I+$sf!E$Ta($Kb`Y#1t1xiZ!80lSp_Z)&;r$R2 z#(>R6{%fbX1q|C#vlKc!-vRLS)JTB-xLF$DBwsfMV6!P8_vzDW2p|Eu#nWgd`TcHs z&RWLQSq*+I>8}7V`qBUv1ov>uXndM@Yj5oh>_53Vze`gM0@;d>r1(#~=bNT0{&8=v)Ao=-m;}8v%DXz6Zv@ zbUK~jbOr=^2{>C2aJ~X^?SCYxLwTnp(8Dp69OH!Y6A?J2hx0Sa&qUx{1^SX-SQ>E} zF_Qz7CX`PwBY_z`j0eeAB(QoLfg{N~mU@y#7Qr}1Kz%g=NCfQtDn_tFV2maL&qN^4 zJ@=0h*i(u?9sw_6AD4uxz?l2HBPB_|K&5KDrH)c4%TNBMd1LKMxxwZP&zBhU)Tvb-|+D zz!oNfB+Pj}BKt6;&;7PBc#m*p!Tcs}zio`*<}R==ktz9MX80Ad3hMTcK!=GOVpt!)kq0&Wye{KgxZY#q%YpdUzbh?TwD?bS!RgiXk!(Sdqt| tfV7bZETCSfKPtdhR)nBWix%$=e*rjio*(64XQluE002ovPDHLkV1mnw(vbiF literal 0 HcmV?d00001 diff --git a/corpus/quantized/storming the grandmothership_1.png b/corpus/quantized/storming the grandmothership_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d316e50436ffbe67a290ab68e304ded26dee8f0d GIT binary patch literal 1639 zcmV-t2AKJYP)9?WuyCc$#WhAM z=HdV;BfGf-h;zqlROVm=aFE7@{y~ucl9^q8EXmm=eJ+xWFj_*;KF+*(oZTg34>d3F zg8mtP+Rr&#qw8eAdGtz!%^? zW04<4C1>UNQO)>=(Q1KCGmw#JyFX+ZL{d4;fXCePANPGHDHcVb+R8=8G!o3 z9gcDx>@NN!`+=1KtiPX*h4Sl8TdDzbv^vdz)_}*y&R$?;A=7|r+qN}9LLKDP#(>hm z*cdGxk*;K>frT;Nmx0z!GJy5Z+`1k(bTCx)&)lB9O$XI1g@XZ-1;`BRpLtgt-;V{% z%nT9%Tr3a_RI(Iq7OK{1$heUKAJ!QjG}nKqZ+1{e7`N1c{_n01(5dNQX03mR-4UA_ zKdNLpvuE!U5ma@+_{?5^PH@0VIv5p-vc zxv4CBYLWQrBm9c%42&5wRHRpWBLtNtK;Wn%kc%RF6>s@Ts6>!z;V}T97UX=~lg1N~ z?F)>4a8Rj6ss*{ow9pHMP?>WMwU7U3vo0u~b&u6J1%RA^$|^}(riGahN(+x6gbSX0zv0>FSQzR(CHxKi?n#L;!Zh(!MY|fn(*;u`cM%_TKE|i@~=D zko*?^b@O}t9n1Q{p}?J=odvz!-#dZ6b^Zea>_ZjNb%q@u0ltiC=SAh1c!KsSCGpW^ ze#uzc7lxuI)m~9bE;Bct1l5R7&1r^>Tbvt36p3dxgiecdqd>DEaG&$0bE9x0w0eIa zCG;B$g7eH^zCVB<>IfY;QXV#)8}nlVg}_>z8)XAR$9{Iyt4Z+=rG}vS1q~>l)Vrcu zAB?k3NY=ux1AU5;Vq_#iAT;T~JZ^;)LMt5<2z5O)>L3&*L`@H^-y@mT{K){Qyho~c z#3Z$!m$V*qPq4p7$aiV0Q9vSK{Y@>13DFOfkAkVxgp~Er)DuKzqva8;2j8s)1AxHX z@br3>X(7|YNK={D!leWGEV*6@!zewtbN~R6C;L<^eX&dB+x}2h<2bT`QXjN(m zlpazY1i?|@2UQlr$Y_cdJ^bR*!Qpi!03iRgs)xjGEJOf|I*&XQH9gdicDXTu0Mpb{ zfK}cfaztTs4R9zY$}{4sdTJIK|6r3PU3?A zM4<^2psLp5_j&}mCNhAqDpf}Wc%vMwbqb?$1QdWR27v%o9aI5A%j7%)vy7q1hi{}{ z;~^AffKmkhd+NYQ;Zx%IFZx6afKQ0$-{=#~028VQ6#Ix40Mzqq^a%yh`v)>v5obtuYxV#D002ovPDHLkV1f+4_RIhP literal 0 HcmV?d00001 diff --git a/python/quantize.ipynb b/python/quantize.ipynb new file mode 100644 index 0000000..4ff5c9a --- /dev/null +++ b/python/quantize.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from util import load_image_128, quantize_image" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processing ../corpus/iso_ray-09_000.png...\n" + ] + } + ], + "source": [ + "corpus_dir = Path('../corpus/')\n", + "quantized_dir = corpus_dir / 'quantized'\n", + "\n", + "for src_path in Path('../corpus/').glob('*.*'):\n", + " dest_path = quantized_dir / src_path.name\n", + " if not dest_path.exists():\n", + " print(f\"Processing {src_path}...\")\n", + " img = load_image_128(src_path)\n", + " img = quantize_image(img)\n", + " img.save(dest_path)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/python/util.py b/python/util.py new file mode 100644 index 0000000..e31c2da --- /dev/null +++ b/python/util.py @@ -0,0 +1,76 @@ +from PIL import Image +from pathlib import Path +import numpy as np +import math + +def load_palette(path: Path) -> np.ndarray: + palette = [] + with open(path, 'r') as f: + for line in f: + hex_color = line.strip() + # Convert hex to RGB tuple + rgb_color = [int(hex_color[i:i+2], 16) for i in (0, 2, 4)] + palette.append(rgb_color) + return np.array(palette) + +pico8_palette = load_palette('../pico-8-secret-palette.hex') + +def load_image_128(path: Path) -> Image.Image: + img = Image.open(path).convert('RGB') + w, h = img.size + if w > 128 or h > 128: + if w % 128 == 0 and h % 128 == 0: + resample = Image.Resampling.NEAREST + else: + resample = Image.Resampling.BICUBIC + if w > h: + w, h = 128, int(round(h * (128 / w))) + else: + w, h = int(round(w * (128 / h))), 128 + img = img.resize((w, h), resample=resample) + return img + + +def quantize_image(img: Image.Image) -> Image.Image: + pal_idxs = choose_subpalette_indexes(img, 16, pico8_palette) + pal = np.array([pico8_palette[i] for i in pal_idxs]).astype(np.float32) + img_np = np.array(img) + pixels = img_np.reshape(-1, 3).astype(np.float32) + distances = np.sum((pixels[:, None, :] - pal[None, :, :]) ** 2, axis=2) + closest_idxs = np.argmin(distances, axis=1).astype(np.uint8).reshape(img_np.shape[1], -1) + result = Image.fromarray(closest_idxs, mode="P") + result.putpalette(pal.astype(np.uint8).reshape(-1).tolist()) + return result + + +def choose_subpalette_indexes(img: Image.Image, n: int, palette: np.ndarray): + assert len(palette.shape) == 2; + assert palette.shape[1] == 3 + img_np = np.array(img) + result = list(range(n)) + num_steps = 0 + pal_idx = 0 + while num_steps < n: + num_steps += 1 + old_val = result[pal_idx] + result[pal_idx] = None + best_err = math.inf + best_val = None + for val in [i for i in range(len(palette)) if i not in result]: + result[pal_idx] = val + err = _squared_quantization_error(img_np, [palette[i] for i in result]) + if err < best_err: + best_err = err + best_val = val + result[pal_idx] = best_val + if best_val != old_val: + num_steps = 0 + pal_idx = (pal_idx + 1) % len(result) + return result + +def _squared_quantization_error(img_np: np.ndarray, palette: np.ndarray): + pixels = img_np.reshape(-1, 3).astype(np.float32) + pal = np.array(palette, dtype=np.float32) + sq_distances = np.sum((pixels[:, None, :] - pal[None, :, :]) ** 2, axis=2) + min_errs = np.min(sq_distances, axis=1) + return np.sum(min_errs)