From f88bdcb0f9a8a0a81c4eec3bccd362d508f3eebe Mon Sep 17 00:00:00 2001 From: VincentAuriau Date: Sun, 22 Oct 2023 23:08:05 +0200 Subject: [PATCH 01/13] ADD: dev illustrations --- dev-illustrations/_bishop_grey.png | Bin 0 -> 16229 bytes dev-illustrations/_bishop_orange.png | Bin 0 -> 17472 bytes dev-illustrations/king_grey.png | Bin 0 -> 24326 bytes dev-illustrations/king_orange.png | Bin 0 -> 24896 bytes dev-illustrations/knight_grey.png | Bin 0 -> 27289 bytes dev-illustrations/knight_orange.png | Bin 0 -> 26716 bytes dev-illustrations/pawn_grey.png | Bin 0 -> 10166 bytes dev-illustrations/pawn_orange.png | Bin 0 -> 10529 bytes dev-illustrations/queen_grey.png | Bin 0 -> 22878 bytes dev-illustrations/queen_orange.png | Bin 0 -> 24008 bytes dev-illustrations/rook_grey.png | Bin 0 -> 7570 bytes dev-illustrations/rook_orange.png | Bin 0 -> 7890 bytes 12 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 dev-illustrations/_bishop_grey.png create mode 100644 dev-illustrations/_bishop_orange.png create mode 100644 dev-illustrations/king_grey.png create mode 100644 dev-illustrations/king_orange.png create mode 100644 dev-illustrations/knight_grey.png create mode 100644 dev-illustrations/knight_orange.png create mode 100644 dev-illustrations/pawn_grey.png create mode 100644 dev-illustrations/pawn_orange.png create mode 100644 dev-illustrations/queen_grey.png create mode 100644 dev-illustrations/queen_orange.png create mode 100644 dev-illustrations/rook_grey.png create mode 100644 dev-illustrations/rook_orange.png diff --git a/dev-illustrations/_bishop_grey.png b/dev-illustrations/_bishop_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..8bbfd4374b95acd95b7dace72c20f3f84a1938c6 GIT binary patch literal 16229 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 literal 0 HcmV?d00001 diff --git a/dev-illustrations/_bishop_orange.png b/dev-illustrations/_bishop_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4fffbd46cc05abbcc8fba4bbc7576ea64e3221 GIT binary patch literal 17472 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 literal 0 HcmV?d00001 diff --git a/dev-illustrations/king_grey.png b/dev-illustrations/king_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..e553fccbf203b397c67250a24b3b054ec8c00c23 GIT binary patch literal 24326 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 Qo^kE-S_I8J{FOWZ0r5bhcmMzZ literal 0 HcmV?d00001 diff --git a/dev-illustrations/king_orange.png b/dev-illustrations/king_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..adf27dd8ad113a69dd22e04c64fc2a0d8b8706b1 GIT binary patch literal 24896 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 z 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 JmT1^M{|}=+v)KRu literal 0 HcmV?d00001 diff --git a/dev-illustrations/knight_grey.png b/dev-illustrations/knight_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..d9cdec3cbbd56f296428931803b39517e78aff8c GIT binary patch literal 27289 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 literal 0 HcmV?d00001 diff --git a/dev-illustrations/pawn_orange.png b/dev-illustrations/pawn_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..09bc093b8768f9467979c3c610dfbd1ffccbbf19 GIT binary patch literal 10529 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 literal 0 HcmV?d00001 diff --git a/dev-illustrations/queen_grey.png b/dev-illustrations/queen_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..c31709c595e41bd2adb758b844271ddb6134a20e GIT binary patch literal 22878 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
dt+9}PqDrBpw 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
Uk~eT>dWWGFkLuo(Hk;6g+~mmZ-$-au9#Zq;c>g zsbaRY9;Suee(>y?`qd_mZ?awZlX-%se?{?&U90p6YgK+4OU#PzGoETc$p=4D_20|@ zb66S=0g6y6cM!iU;H0oO1koHrenRAf!K@%8j0l9%l}15M_xDxUC;!(~e|of5D6cAOW1*vII>$hOZ-IHP z({;-;ck}i=ix;f#lM?(B#|x#mD%ZdL_>iopyIEgVZKjk=QWI-Z?_)SFv=kK?m)>il zroUReuVO=L-iJ6h@_#GXa(`RaZ0*Y;4MMR0Rzxp`!!)%e9=-4S-&ypBO z6t}A`_a8TLs(Hy~64TC6lNdNxH>+koW|2DERN4^v*lx^FmU^}B$iaDijiB0n)p?C8 zZiE)=>V=l_8Q&GhRms}&wauK2oI-)!3vHY~jme*AoA!15KQAPWzFpAfa`}skH72RW zT76+@&U%5i)>*qMcV_8Lp1Z*bi|@S)x7Gz^uK6iodbWfax zaHnq4Dt6zK8qaCm%xeKLEv(zK-szj}j)k~;c_XLg4~XiTW~neX4^U1k4QUQX86uecl(xhZ*D|OzBF?k zBKvy1xF##TV5+{Zp>>_pSMvm~M|J`$S;Pb=`#Gc8`0mQ6v%!gr#si}D-_~kFf@cqy zt(%iHx)!yvQ0*T}dYI)1zAl5WZFUXVa-ImFKL1!B(y1Qscx+2UmbF}o8pH{g&B+#S z>fr&x`%_uYo8M0`@K;!96SXpItS+Q21q^;!U*jDTTV8qmh2Sk&cj-cmW}E~iOEqeCs6if-vjoj>DEN| zE0*`KVv|Glv}NtEK)O3JW+OdQ-4Y%9(Ek7s<3t|- literal 0 HcmV?d00001 diff --git a/dev-illustrations/rook_grey.png b/dev-illustrations/rook_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..a06c741c75e148a80820f9a5b0aaec5571134585 GIT binary patch literal 7570 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%0Am_M8#wvba_)^8I&-H%M=tAyd)Q5e6YRHl2t zmIhFz0NAoHT+2fE$)J}4h-pLej=};DvjGDG;=09gLYFkHw5;KVb*U){)Gx^)Cg0@830l1QToB}d3WOKpu@aR^!7 zV}Dby`j1xonY3=cL+aekg=RvS67$zlIIEV?zS=-w;d7`+c$Db%34}l zg1ch$JxHbF4`_?DhTlIj9qCe?5B9on;Y(CjWP;h@!_Yn!w1=h#j&|2TwOgjP<;Z60 z}$Jp`)1sZ{EbdFUu_I({FGx7Lm)8)uFJT9Y&VnDS>>b19VZ7+mCtgqE1Pd8%L>HIs1&5%)w@NZN71k4H zPxSTmouZxGS^4VKL9dQ7qtC6ag4zpoL80%q-EkIB;Z;K6ES~H|Wx*uO#va!G)vGPU zl#bbm#`+tAX34Duq}YmzLu;cHqNh>xfFtSQ3uvPzIT)&S-@w2+2|kL_`qCS_Z=Z|B zRRw?O`VT~Wr#O@Z`?i=AKt(tCF`Ig-Iq%{zpR5x;gv6f4w3D@wCBN^iG@59W>+w7D z_R*0S1qIdU7nDDlGX{H)?apz%OR$3Z3L&H?t}<4U#wnctKI05ShGDHc zKf%OcG{e3bgirg!oJL3g5TC*=51Dl8#K4@wu&Y8=b?n~rJ329KLGz>W<(1vt zF51_U`xES;dWRrSo~?hgCcbQgfq_Ar?v|KEo}RSQu!*Df^hgL(7lhP0&Gsk<&#`14 zus#-gHv>ATFzL|9C+|CpYUi@jVJ0!sRqZGzx&JUJDW;%lE(-CHu6XsP|AP6P|Q#YelZrZTnH;PaS zs_4!L>lw7E#ztGM{uuS)vKb$%rPpqq3q6q<3c+R?1nj1>BwP-~%S&@auEe=|wPXLC zpJ8keBTBcq)`KhgqnNaW;#soIptC5@Tj2X)k+g-*tJ8oWkm!m>^JpGSn8R=e}!vYUZWCS=F| z{r`+Ra@WshzU(Zw&9p-uK=!HKag&o>vD?&$uC6=aDm-s}WeI9Jp^Z{ggXv!Nr_6I* zaOIc`h{X}%rp{$KIsbBYc76dt(T772zC%Xu)wge#Z{5082@Np(f#DhM{GDegZX|?{ ze}on)Yu~FKNvKKbx@)$1msd;PMel{79j0uu(-Q`ZS(*ps&@3^ZZ@j6;kDc?+!fCp_ z*+}W5$H$MqTzU*C4FitjAYi@SdP#0>E*hsf9J-<~+D*5r>g&5C_=}Vlq(<7_EfR^W zcgH=3e1tpX$?rQ4LtN5Vy}#n|LWxGBsDUMPxYIET-79qVfH%VY{ z7CP4V!SE>M(xsiydWP%C*!6!h`)6!?oC5|rlu>ZTGeh}>@ZU&hN7z(P{FCzX@|O|w z-&?OyTe+iACbN%TwqXoqWo4Z&U*5a?`ZfM9ua>a=`)w%G{VWikFd6e@qI^F5k?n3l ziAbn>u)3;hohd<6!5PjMTus}%Wj1AGXJa^d^;zRC$+w^P){oFFTZ7 zHto@ALV>yIQAfv=Ju7p}(dmR45{x^ yjUSVS9}|Zwb*KLR=#ll)75e}8UxMthdHWlCU5?zDJ%IikH9ul`IP2F7*Zu={*WEh+ literal 0 HcmV?d00001 diff --git a/dev-illustrations/rook_orange.png b/dev-illustrations/rook_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..120fb6b9b959bcbbc84d825a4413da2c5313c43e GIT binary patch literal 7890 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 Date: Sat, 25 Nov 2023 23:20:27 +0100 Subject: [PATCH 02/13] ADD: draft of colorize function --- utils/colorize.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 utils/colorize.py diff --git a/utils/colorize.py b/utils/colorize.py new file mode 100644 index 0000000..6a221dd --- /dev/null +++ b/utils/colorize.py @@ -0,0 +1,53 @@ +import matplotlib.pyplot as plt +import numpy as np + +from PIL import Image + +black_pawn = np.array(Image.open("../dev-illustrations/knight_grey.png")) +black_pawn = black_pawn.astype("float32") +black_pawn = black_pawn.astype("uint8") +print(black_pawn[300]) + +print(np.unique(black_pawn[:, :, :3])) +print("R") +print(np.unique(black_pawn[:, :, 0])) +print("G") +print(np.unique(black_pawn[:, :, 1])) +print("B") +print(np.unique(black_pawn[:, :, 2])) +print("A") +print(np.unique(black_pawn[:, :, 3])) +plt.imshow(black_pawn[:, :, :]) +plt.show() + + +black_pawn = black_pawn[:, :, :3] +for h in range(len(black_pawn)): + row = black_pawn[h] + for w in range(len(row)): + pix = row[w] + for i in range(len(pix)): + if pix[i] in list(range(116, 165)): + black_pawn[h][w][i] = 255 + elif pix[i] == 0: + pass + else: + pix[i] = 128 * (i == 0) + +plt.imshow(black_pawn[:, :, :3]) +plt.show() +print(black_pawn) + +r_dict = {0:0, 128: 255, 255: 175} +g_dict = {0:0, 128: 192, 255: 238} +b_dict = {0:0, 128: 203, 255: 238} +own_pawn = [np.vectorize(r_dict.get)(black_pawn[:, :, 0].astype("uint8")), +np.vectorize(g_dict.get)(black_pawn[:, :, 0]), +np.vectorize(b_dict.get)(black_pawn[:, :, 0])] +own_pawn = np.dstack(own_pawn) +rose = 255, 192, 203 +turq = 175,238,238 +print(own_pawn) +plt.imshow(own_pawn) +plt.show() + From a2974bb51a818d2bdb84ca983419dff616cf4428 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Sun, 26 Nov 2023 12:50:34 +0100 Subject: [PATCH 03/13] small changes --- utils/{colorize.py => create_base.py} | 52 ++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) rename utils/{colorize.py => create_base.py} (51%) diff --git a/utils/colorize.py b/utils/create_base.py similarity index 51% rename from utils/colorize.py rename to utils/create_base.py index 6a221dd..2f45be8 100644 --- a/utils/colorize.py +++ b/utils/create_base.py @@ -3,7 +3,7 @@ from PIL import Image -black_pawn = np.array(Image.open("../dev-illustrations/knight_grey.png")) +black_pawn = np.array(Image.open("../dev-illustrations/_bishop_grey.png")) black_pawn = black_pawn.astype("float32") black_pawn = black_pawn.astype("uint8") print(black_pawn[300]) @@ -19,8 +19,55 @@ print(np.unique(black_pawn[:, :, 3])) plt.imshow(black_pawn[:, :, :]) plt.show() +plt.imshow(black_pawn[:, :, 3], cmap="gray") +plt.show() + +bp = black_pawn.copy() + +for i in range(300, 400): + for j in range(125, 360): + bp[i][j][0] = 255 + bp[i][j][1] = 255 + bp[i][j][2] = 255 + +for i in range(400, 440): + for j in range(125, 360): + bp[i][j][0] = 255 + bp[i][j][1] = 255 + bp[i][j][2] = 255 + +for i in range(440, 500): + for j in range(125+int((i-440) / 2), 360-int((i-440) / 2)): + bp[i][j][0] = 255 + bp[i][j][1] = 255 + bp[i][j][2] = 255 + +for i in range(500, 517): + for j in range(155+2*(i-500), 330-2*(i-500)): + bp[i][j][0] = 255 + bp[i][j][1] = 255 + bp[i][j][2] = 255 +""" +for i, j in zip([479, 480, 481]*3, [138, 138, 138, 139, 139, 130, 140, 140, 140]): + bp[i][j][0] = 255 + bp[i][j][1] = 0 + bp[i][j][2] = 0 +for i, j in zip([480, 481, 482], [141, 141, 142]): + bp[i][j][0] = 255 + bp[i][j][1] = 0 + bp[i][j][2] = 0 +plt.figure() +plt.imshow(bp[:, :, :3]) +plt.show() +""" +plt.figure() +plt.imshow(bp[:, :, :3]) +plt.show() + +black_pawn = bp + black_pawn = black_pawn[:, :, :3] for h in range(len(black_pawn)): row = black_pawn[h] @@ -36,6 +83,9 @@ plt.imshow(black_pawn[:, :, :3]) plt.show() + +img = Image.fromarray(black_pawn[:, :, 0]) +img.save("../gs_illustrations/bishop_grey.png") print(black_pawn) r_dict = {0:0, 128: 255, 255: 175} From 0553abd38182100a78ddc1024251a0ed27c2acad Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Sun, 10 Dec 2023 20:08:51 +0100 Subject: [PATCH 04/13] ADD: grayscale patron images --- gs_illustrations/bishop_grey.png | Bin 0 -> 4018 bytes gs_illustrations/king_grey.png | Bin 0 -> 5621 bytes gs_illustrations/knight_grey.png | Bin 0 -> 5961 bytes gs_illustrations/pawn_grey.png | Bin 0 -> 3440 bytes gs_illustrations/queen_grey.png | Bin 0 -> 5135 bytes gs_illustrations/rook_grey.png | Bin 0 -> 3068 bytes utils/create_base.py | 77 +++++++++++++++++++++++++++---- 7 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 gs_illustrations/bishop_grey.png create mode 100644 gs_illustrations/king_grey.png create mode 100644 gs_illustrations/knight_grey.png create mode 100644 gs_illustrations/pawn_grey.png create mode 100644 gs_illustrations/queen_grey.png create mode 100644 gs_illustrations/rook_grey.png diff --git a/gs_illustrations/bishop_grey.png b/gs_illustrations/bishop_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..17d6e175e08c1f3400d5aa8893c8b16268206679 GIT binary patch literal 4018 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 literal 0 HcmV?d00001 diff --git a/gs_illustrations/knight_grey.png b/gs_illustrations/knight_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..92bc80933fd9201eb7cdb7d89e8ee5d54295f3d4 GIT binary patch literal 5961 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 literal 0 HcmV?d00001 diff --git a/gs_illustrations/pawn_grey.png b/gs_illustrations/pawn_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..ea15c1d867a1813b08657cfdbcda13e672648c5f GIT binary patch literal 3440 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 WI=^wey3t>wl;eS;4h*}qasL74r)s|d literal 0 HcmV?d00001 diff --git a/gs_illustrations/queen_grey.png b/gs_illustrations/queen_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..a61a5525dc4bb69deb536e333bfaed2a57ab403f GIT binary patch literal 5135 zcmchbX*ksH+y5=!enPfX7-kqk5!u&48Edkqv8M%KF;H~j`MoOT3Hx#aX>hjn3%Xs zO$=<9n3(BIOe{~19|f2$I(ct0G4YR^8eG1H&H9-=6;z?!sic+V$*p{{_Vt+Qt#-TQB>8bfF>*f`8w z7d&PY_}BoTtXCo1&rA7c;6-1`P~YK2pCZ!Mt^s;`ry_c+N2^7?#f{XKnZ6S5x!Gp# zsu4lbT6S<0@5Qufw4q)W!C%IMIMI|dy9xpyUB1lq z^`}O!eUX?CM;4*kmD?P6<|^g*Lh_Hgy{7Y~?$d-G)?RGJ%=G;3m?0o1oZQt{ScfIU zAi-`I5eoAvzQ@TK8OP&8txA?KfjLLcW*fRv0?#powpy41^d~phg}R9Cb^o}G`7i+= z!K#U^q>5iy$2SHFFj~ z(dwkv-ld8{e>|r`RJ87>#GZr3mnNp$uI`&by{#Xk7x4m)p>0a-q5G=2 z950_3ukpJbX4VAKO{&mp%!~)DeE*ZDZ?h4a_K7~QJ)|w* z!q#y9*~p@F=3Z(cy7c!i9xx+=s7=_4*rpu39}Ulvyt&`IEc@9gw>eMcll;|Yp4Dvk z=BS-fU8~Wh6)i9tNB^re;KdUYi7~DqzkZ(`g&ah2NkG*S=i&21^twV0s-rslGTLHr zMb{-*-o|qfaI)>&E_erE&z7UmE1`Y%@v;L6|(!JNT8#*!#$3NT(zdyo*PI3JhLcT zUuV1noxFM*Y$v$58UdphrTkWQiBhJ}Qk9iG1y~Yc_eLc1B68Qo4dA*Y|04#7_)8r6 zsxv!bbA__PuuFnvr*4uycD1V-J-5nZby{>#2iD%=|iIRZK5p1U6`PL(LZtTR_c z7<%Nyyu5d7#Bvy0^7mwJCq7uldIjbJofOUaNv2F4X;=T6*G0ZtlM2W?576 zrd@h0>SNg3^8+|=J9nuNofq2DZEylfDUd&`an7oTd=Uj~r+>@hR&~aw{LKMXd8v!_ zU=Zfv>+%m(nA-iH>ZcOg*Mhe`7g}`osR&G0Oi5tBWg5uS1SH*>hoFj3=A&c8P!J?B3$?G98P6 zi6@qadM?buQO#8=4x^Tvb*H{mOVd+dhR--84<1Wj{H|YiuC%Eo$tHs6+ree*|KjJd zVTG)U?BV;`R#iL?W%C`l)L8 zdL8#^7g=G}Gev6|XC;Gn9bTkEz}>_~vp5yyREtsEe%W0Tw%ayxMfGKzf$p&y534ez z0|&0tzrGe{@*XUv$xH)u-US(WqCNBNP^~uJ*&0IL!1mUgvJ~`6A(=1N)sENI*d1su zb!N4JDZJeBmRa!ecd%z-vokov(9j4NC|AfZ)VwicDMlhpW@npu>C zNulgQ0XaWudZqCf+uu_w_M~dBce%#SKw&f zvVA=TEvTp&))qifkS8F$q3YKom_0tAGlKi$*EZ3Z2YRPF9d_c4{B4c+XFbC9-NE$a zHwp6=yS1lh>4xP|(uZqjeG+GgJqKK>LKKAc$7?%5RSAzy1D@}Lh@ow9Q)w8pg@6lT zRbQ>J{60Xv8iKPK)ot8X=;k<@X!g+7M5~MbQ~i@wX*qx4lL=iYg>&`YQa=zZy7D$m zY@Uw>PaaCIi8ToY)RWYU!eVbG${b&fYaj+V>?eP+nD`lNA~y#Gg5fAs_)N4V>UxVwwo#h_QBiodb2w;^;fc5=s+hbB zVAd)VKU@F9%rL~V(8Sd<~p4ug-UmgD$ zM77$s@7#?)+8FMUHop59vDahK?^+q-1PbO@U*%dy43D55M@UJs6ZEwM(P!4&yFx_1 zd|LZ~c$f-R0^mWeq%zhZw`y3Qu}}0gv@uGfEiK?YKde28I0@Z5dv{7L&e!J%2OVy_ z7@msb_w>FbC;JC@HkIZrZ>jMph%yL{R1tc6DNLIgVJ#I>j``eJ(aD` z4~C`0p9uwD3HfZC=@O}^Q5G-<;S*I2KjVLFVTfY022)w)uSmnVFHE#fZiZhmdqV4J zi+29T%nMNJG1OkId z-?s>j`RUBoSGDI2$p}#0a%V%{i>nbf@_^4;F`SQ~yMWrVNfj0Gk2Vf@lSZr+uXu&A zTewfYb?j>G8b$?wBS>3zfoUW#JK@@mVVp#Tb^?k#*fwYHYOtYE5nVd=KoZrERUb>r&& zjs_Rdrvxh?M^a}4Y4z)!$BKl_Wk=M8)E6JDJa05t`6dnWgCz`Q_#1=p6q&)dX{5 z{QahQdMbeeU)Y7xWPZ?(UclJFhJ62h!fGEr>_Mhqb4A@VF)3w%SG z@e}UR&Qj&5k85~A2cWGT_VVHqp=?Qh)%g0cK)D4AI67@yhO9tkQdZ|vG;16_mY(`Z zCOd&ul01OD-JO!`g$t8=yJedh?PMe(34SM4O3}(Sqpvi)rjHW@Qq+U}dtbDyE6+q{ z8j;~3lC)~s?kBN~uivubTG$-fs2fID4afVQ(Z+)tkItwqv=29$L5V(IP4DOlF4wIp zgc%);XC@2G4ZM|S5h2>wxK$k9@1E?TyxuxqpP(@?H5C`nh|;2$HnSAH@eq?DPhyR` zFOgmCf*5sBqHDO+xwiCL#AKwO09k2PFQgeoGTt1Mpe}lPUewC8E-qFnS6!Vd z@HF32(LKr7PDZU<+75RONW^cc6;?-jPHcurtlSGbHy>;=s1wuO0FM4z(oIzdMKCDP zwaZ|@uYcR#WmR7ytBCb^a3@+hAkMwW^l3mLbX#pOtHC%+$P!mgk9;8lIgG)%XORqV zId;rw4E}xP=mR#XF+jkL{$c`8geV*ceV_knZqgYNl$vl9*b!Ca^8`ltZf3y+*pF6g zAV8K!yz{7zDh^A=jBjXY1jNBFP_2P#9Ad2@gKov*p<)dL;1Cr>talK_j7vnkr!F!M zk97kACN?yPr4RM>C1Cfm;5<=6!P08f*MJb?xR_GTl@Pzq+wn)KoUGzthCU2RcLR6y zVU+qO$~i%dGZPbvB@ZD)uZJ!48aR){G*+HT9EQ$<2TPH+aetBc#JSxN6d}h8bYOin zFeXMqP`W})(DI}|J_ac$opVXhlFy$Ib6fCGq0&Dc`AGrxWfjVh>~^>xwx} z5k}#?$E2vcJI^IeRRCfI6o6uGO{-1}o?qGzZz<%&{8jbao{7^^qZbM7oJ4#0|LlGVhpk=Ma9-exl=& zvaS%8uS{qW_>+To^H|5E&h$E zpX&pstS(WSA!kLRm;6p<+PI+rCK>IS?R~zj0HTZd4>a@q7VH5^zhbsu9`dmgZ1zwt zL^e^^I+xQ^hOug2@e-YG_rK!#Z~r@R_=hS~Uk0c0{tJirpM?>* z#}J1|u?HUlsUBHPP70$`_bj5YB0qRLt8J!I2~-Mrv&LNp>Hnk=9ei`to7?WuV|AN{ zl_Beeu_B=$=UlSO6Z-BDBHk7&dE@)P9`?ms9##l*UbvC!u5(lgyFhsZ2D)SuGZnn$ zXH7dgS9G)hAgSdzXt8}Ki?fb)3{-G}a51IUT vb6{=Ro)+ockH_i%*|GHh2|nZ1ucGT&v?!+hu(1jHL;6e&EetC3-5&oNlFauy literal 0 HcmV?d00001 diff --git a/gs_illustrations/rook_grey.png b/gs_illustrations/rook_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..7f58eeaf8142bd59ea3cdcf5451ced28111cc0ae GIT binary patch literal 3068 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 literal 0 HcmV?d00001 diff --git a/utils/create_base.py b/utils/create_base.py index 2f45be8..54a6099 100644 --- a/utils/create_base.py +++ b/utils/create_base.py @@ -3,11 +3,13 @@ from PIL import Image -black_pawn = np.array(Image.open("../dev-illustrations/_bishop_grey.png")) +black_pawn = np.array(Image.open("../dev-illustrations/queen_grey.png")) black_pawn = black_pawn.astype("float32") black_pawn = black_pawn.astype("uint8") -print(black_pawn[300]) - +print("I_I") +print(black_pawn[0][:10]) +print("I_I") +print(black_pawn[120][200]) print(np.unique(black_pawn[:, :, :3])) print("R") print(np.unique(black_pawn[:, :, 0])) @@ -24,31 +26,42 @@ bp = black_pawn.copy() +""" +Beautification of the Bishop + for i in range(300, 400): - for j in range(125, 360): + for j in range(120, 368): bp[i][j][0] = 255 bp[i][j][1] = 255 bp[i][j][2] = 255 for i in range(400, 440): - for j in range(125, 360): + for j in range(124, 368): bp[i][j][0] = 255 bp[i][j][1] = 255 bp[i][j][2] = 255 for i in range(440, 500): - for j in range(125+int((i-440) / 2), 360-int((i-440) / 2)): + for j in range(125+int((i-440) / 2), 368-int((i-440) / 1.5)): bp[i][j][0] = 255 bp[i][j][1] = 255 bp[i][j][2] = 255 -for i in range(500, 517): + +for i in range(460, 500): + for j in range(250+int((i-460) / 2), 359-int((i-460) / 1.5)): + bp[i][j][0] = 255 + bp[i][j][1] = 255 + bp[i][j][2] = 255 + +for i in range(500, 519): for j in range(155+2*(i-500), 330-2*(i-500)): bp[i][j][0] = 255 bp[i][j][1] = 255 bp[i][j][2] = 255 +""" """ for i, j in zip([479, 480, 481]*3, [138, 138, 138, 139, 139, 130, 140, 140, 140]): bp[i][j][0] = 255 @@ -62,6 +75,50 @@ plt.imshow(bp[:, :, :3]) plt.show() """ + +""" +# Beautification of Rook + +for i in range(80, 86): + for j in range(114, 168): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 +for i in range(42, 86): + for j in range(114, 120): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 +for i in range(42, 86): + for j in range(162, 168): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 + +for i in range(80, 86): + for j in range(205, 259): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 + +for i in range(86, 90): + for j in range(205, 260): + bp[i][j][0] = 100 + bp[i][j][1] = 100 + bp[i][j][2] = 100 + +for i in range(42, 86): + for j in range(205, 211): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 +for i in range(42, 86): + for j in range(253, 259): + bp[i][j][0] = 120 + bp[i][j][1] = 120 + bp[i][j][2] = 120 +""" + plt.figure() plt.imshow(bp[:, :, :3]) plt.show() @@ -76,8 +133,8 @@ for i in range(len(pix)): if pix[i] in list(range(116, 165)): black_pawn[h][w][i] = 255 - elif pix[i] == 0: - pass + elif pix[i] == 255 or pix[i] == 0: + pix[i] = 0 else: pix[i] = 128 * (i == 0) @@ -85,7 +142,7 @@ plt.show() img = Image.fromarray(black_pawn[:, :, 0]) -img.save("../gs_illustrations/bishop_grey.png") +img.save("../gs_illustrations/queen_grey.png") print(black_pawn) r_dict = {0:0, 128: 255, 255: 175} From d896978909d0aaf30c71e7d05da90d7a511b2ab1 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Sun, 10 Dec 2023 21:12:11 +0100 Subject: [PATCH 05/13] ADD: unfishied color editor - TrainDev --- .../{bishop_grey.png => bishop_gray.png} | Bin .../{king_grey.png => king_gray.png} | Bin .../{knight_grey.png => knight_gray.png} | Bin .../{pawn_grey.png => pawn_gray.png} | Bin .../{queen_grey.png => queen_gray.png} | Bin .../{rook_grey.png => rook_gray.png} | Bin pyalapin/interface/color_edition.py | 105 ++++++++++++++++++ settings.py | 12 ++ 8 files changed, 117 insertions(+) rename gs_illustrations/{bishop_grey.png => bishop_gray.png} (100%) rename gs_illustrations/{king_grey.png => king_gray.png} (100%) rename gs_illustrations/{knight_grey.png => knight_gray.png} (100%) rename gs_illustrations/{pawn_grey.png => pawn_gray.png} (100%) rename gs_illustrations/{queen_grey.png => queen_gray.png} (100%) rename gs_illustrations/{rook_grey.png => rook_gray.png} (100%) create mode 100644 pyalapin/interface/color_edition.py create mode 100644 settings.py diff --git a/gs_illustrations/bishop_grey.png b/gs_illustrations/bishop_gray.png similarity index 100% rename from gs_illustrations/bishop_grey.png rename to gs_illustrations/bishop_gray.png diff --git a/gs_illustrations/king_grey.png b/gs_illustrations/king_gray.png similarity index 100% rename from gs_illustrations/king_grey.png rename to gs_illustrations/king_gray.png diff --git a/gs_illustrations/knight_grey.png b/gs_illustrations/knight_gray.png similarity index 100% rename from gs_illustrations/knight_grey.png rename to gs_illustrations/knight_gray.png diff --git a/gs_illustrations/pawn_grey.png b/gs_illustrations/pawn_gray.png similarity index 100% rename from gs_illustrations/pawn_grey.png rename to gs_illustrations/pawn_gray.png diff --git a/gs_illustrations/queen_grey.png b/gs_illustrations/queen_gray.png similarity index 100% rename from gs_illustrations/queen_grey.png rename to gs_illustrations/queen_gray.png diff --git a/gs_illustrations/rook_grey.png b/gs_illustrations/rook_gray.png similarity index 100% rename from gs_illustrations/rook_grey.png rename to gs_illustrations/rook_gray.png diff --git a/pyalapin/interface/color_edition.py b/pyalapin/interface/color_edition.py new file mode 100644 index 0000000..dcf606e --- /dev/null +++ b/pyalapin/interface/color_edition.py @@ -0,0 +1,105 @@ +import numpy as np +from PIL import Image + +from settings import settings + +class ColorEditor(object): + + def __init__(self, + white_cell, + down_white_cell, + black_cell, + down_black_cell, + white_piece_fill, + white_piece_border, + black_piece_fill, + black_piece_border): + + self.white_cell = white_cell + self.down_white_cell = down_white_cell + self.black_cell = black_cell + self.down_black_cell = down_black_cell + self.white_piece_fill = white_piece_fill + self.white_piece_border = white_piece_border + self.black_piece_fill = black_piece_fill + self.black_piece_border = black_piece_border + + def get_edited_black_cell(self): + return np.array([[self.black_cell] * 64] * 64), np.array([[self.down_black_cell] * 64] * 64) + + def get_edited_white_cell(self): + return np.array([[self.white_cell] * 64] * 64), np.array([[self.down_white_cell] * 64] * 64) + + def get_edited_black_material(self, material_type, cell_color): + if cell_color == "black": + cell_color = self.black_cell + else: + cell_color = self.white_cell + + image = Image.open(settings["grayscale_images"][material_type]) + r_map = {0: cell_color[0], 128: self.black_piece_fill[0], 255: self.black_piece_border[0]} + g_map = {0: cell_color[1], 128: self.black_piece_fill[1], 255: self.black_piece_border[1]} + b_map = {0: cell_color[2], 128: self.black_piece_fill[2], 255: self.black_piece_border[2]} + + edited_img = np.array(image) + edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img)]) + + if cell_color == "black": + cell_color = self.down_black_cell + else: + cell_color = self.down_white_cell + + r_map = {0: cell_color[0], 128: self.black_piece_fill[0], 255: self.black_piece_border[0]} + g_map = {0: cell_color[1], 128: self.black_piece_fill[1], 255: self.black_piece_border[1]} + b_map = {0: cell_color[2], 128: self.black_piece_fill[2], 255: self.black_piece_border[2]} + + down_edited_img = np.array(image) + down_edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img)]) + + return edited_img, down_edited_img + + def get_edited_white_material(self, material_type): + if cell_color == "black": + cell_color = self.black_cell + else: + cell_color = self.white_cell + + image = Image.open(settings["grayscale_images"][material_type]) + r_map = {0: cell_color[0], 128: self.white_piece_fill[0], 255: self.white_piece_border[0]} + g_map = {0: cell_color[1], 128: self.white_piece_fill[1], 255: self.white_piece_border[1]} + b_map = {0: cell_color[2], 128: self.white_piece_fill[2], 255: self.white_piece_border[2]} + + edited_img = np.array(image) + edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img)]) + + if cell_color == "black": + cell_color = self.down_black_cell + else: + cell_color = self.down_white_cell + + r_map = {0: cell_color[0], 128: self.white_piece_fill[0], 255: self.white_piece_border[0]} + g_map = {0: cell_color[1], 128: self.white_piece_fill[1], 255: self.white_piece_border[1]} + b_map = {0: cell_color[2], 128: self.white_piece_fill[2], 255: self.white_piece_border[2]} + + down_edited_img = np.array(image) + down_edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img)]) + + return edited_img + + + def generate_all_images(self, path="temp_illustrations"): + b = self.get_edited_black_cell() + Image.from_array(b).save(os.path.join(path, "b.png")) + w = self.get_edited_black_cell() + Image.from_array(b).save(os.path.join(path, "w.png")) + for piece in ["pawn", "bishop", "knight", "rook", "king", "queen"]: + b_p = self.get_edited_black_material(material_type=piece, ) + diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..f343b83 --- /dev/null +++ b/settings.py @@ -0,0 +1,12 @@ +settings = { + "stockfish_path": "/Users/vincent.auriau/Python/stockfish/bin/stockfish", + + "grayscale_images": { + "pawn": "gs_illustrations/pawn_gray.png", + "bishop": "gs_illustrations/bishop_gray.png", + "knight": "gs_illustrations/knight_gray.png", + "rook": "gs_illustrations/rook_gray.png", + "king": "gs_illustrations/king_gray.png", + "queen": "gs_illustrations/queen_gray.png", + }, +} \ No newline at end of file From 0ec36cb55f08501722ece4598113dc61fb040ca5 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Sun, 10 Dec 2023 21:25:56 +0100 Subject: [PATCH 06/13] ADD: final untested ColorEditor - TrainDev --- pyalapin/interface/color_edition.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/pyalapin/interface/color_edition.py b/pyalapin/interface/color_edition.py index dcf606e..c5a8dfe 100644 --- a/pyalapin/interface/color_edition.py +++ b/pyalapin/interface/color_edition.py @@ -62,7 +62,7 @@ def get_edited_black_material(self, material_type, cell_color): return edited_img, down_edited_img - def get_edited_white_material(self, material_type): + def get_edited_white_material(self, material_type, cell_color): if cell_color == "black": cell_color = self.black_cell else: @@ -96,10 +96,26 @@ def get_edited_white_material(self, material_type): def generate_all_images(self, path="temp_illustrations"): - b = self.get_edited_black_cell() + b, down_b = self.get_edited_black_cell() Image.from_array(b).save(os.path.join(path, "b.png")) - w = self.get_edited_black_cell() - Image.from_array(b).save(os.path.join(path, "w.png")) + Image.from_array(down_b).save(os.path.join(path, "down_b.png")) + w, down_w = self.get_edited_black_cell() + Image.from_array(w).save(os.path.join(path, "w.png")) + Image.from_array(down_w).save(os.path.join(path, "down_w.png")) for piece in ["pawn", "bishop", "knight", "rook", "king", "queen"]: - b_p = self.get_edited_black_material(material_type=piece, ) - + wb_p, down_wb_p = self.get_edited_black_material(material_type=piece, "white") + bb_p, down_bb_p = self.get_edited_black_material(material_type=piece, "black") + ww_p, down_ww_p = self.get_edited_white_material(material_type=piece, "white") + bw_p, down_bw_p = self.get_edited_white_material(material_type=piece, "black") + prefix = "N" if piece == "knight" else piece[0].upper() + Image.from_array(wb_p).save(os.path.join(path, f"wb_{prefix}.png")) + Image.from_array(down_wb_p).save(os.path.join(path, f"down_wb_{prefix}.png")) + + Image.from_array(bb_p).save(os.path.join(path, f"bb_{prefix}.png")) + Image.from_array(down_bb_p).save(os.path.join(path, f"down_bb_{prefix}.png")) + + Image.from_array(ww_p).save(os.path.join(path, f"ww_{prefix}.png")) + Image.from_array(down_ww_p).save(os.path.join(path, f"down_ww_{prefix}.png")) + + Image.from_array(bw_p).save(os.path.join(path, f"bw_{prefix}.png")) + Image.from_array(down_bw_p).save(os.path.join(path, f"down_bw_{prefix}.png")) From 1ecf64d1da56fdf2a6447eab68b7d192f9487e8e Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Thu, 28 Dec 2023 21:28:03 +0100 Subject: [PATCH 07/13] ADD: generic colorization function --- pyalapin/interface/interface.py | 13 +++++- utils/create_figures.py | 78 +++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 utils/create_figures.py diff --git a/pyalapin/interface/interface.py b/pyalapin/interface/interface.py index 0e37ff1..d41d332 100644 --- a/pyalapin/interface/interface.py +++ b/pyalapin/interface/interface.py @@ -89,7 +89,18 @@ def __init__(self, game, **kwargs): """ super(BoardInterface, self).__init__(**kwargs) - self.path_to_illustrations = "illustrations" + if os.path.isdir("temp_images"): + imgs = [] + for z in os.listdir("temp_images"): + if "png" in z: + imgs.append(z) + if len(imgs) == len(os.listdir("illustrations")): + self.path_to_illustrations = "temp_images" + else: + self.path_to_illustrations = "illustrations" + else: + self.path_to_illustrations = "illustrations" + self.game = game if game.ai: diff --git a/utils/create_figures.py b/utils/create_figures.py new file mode 100644 index 0000000..de2d01f --- /dev/null +++ b/utils/create_figures.py @@ -0,0 +1,78 @@ +import os + +from PIL import Image +import numpy as np + +color_cell_b = [0, 191, 255] +border_color_b = [0, 0, 0] +inner_color_b = [109, 7, 26] + +color_cell_w = [207, 185, 151] +border_color_w = [255, 255, 255] +inner_color_w = [200, 200, 200] + +down_color_cell_b = np.clip(np.array(color_cell_b) - 70, 0, 255) +down_color_cell_w = np.clip(np.array(color_cell_w) - 70, 0, 255) + +def color_one_img(pil_img, background_color, border_color, inner_color): + img = np.array(pil_img) + x_min = np.min(np.where(img==255)[0]) + x_max = np.max(np.where(img==255)[0]) + img = img[x_min:x_max] + + + r_dict = {0:background_color[0], 128: inner_color[0], 255: border_color[0]} + g_dict = {0:background_color[1], 128: inner_color[1], 255: border_color[1]} + b_dict = {0:background_color[2], 128: inner_color[2], 255: border_color[2]} + + img = [np.vectorize(r_dict.get)(img), + np.vectorize(g_dict.get)(img), + np.vectorize(b_dict.get)(img)] + img = np.dstack(img) + + img = Image.fromarray(img.astype("uint8")) + + img = img.resize((int(img.size[0]/img.size[1]*450), 450)) + + x_coordinate = int((500 - img.size[0]) / 2) + y_coordinate = 25 + + background = np.dstack([np.ones((500, 500))*background_color[i] for i in range(3)]).astype("uint8") + background = Image.fromarray(background) + background.paste(img, (x_coordinate, y_coordinate)) + return background + +for img_name in os.listdir("../gs_illustrations"): + img = Image.open(os.path.join("../gs_illustrations", img_name)) + img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) + img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) + img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) + img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) + + down_img_bb = color_one_img(img, down_color_cell_b, border_color_b, inner_color_b) + down_img_ww = color_one_img(img, down_color_cell_w, border_color_w, inner_color_w) + down_img_wb = color_one_img(img, down_color_cell_w, border_color_b, inner_color_b) + down_img_bw = color_one_img(img, down_color_cell_b, border_color_w, inner_color_w) + + name = img_name.split("_")[0] + name = {"pawn": "P", "bishop": "B", "knight": "N", "rook": "R", "queen": "Q", "king": "K"}[name] + img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) + img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) + img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) + img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) + + down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) + down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) + down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) + down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) + +bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_w[i] for i in range(3)]).astype("uint8")) +bg_w.save(os.path.join("../temp_images", "w.png")) +bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_b[i] for i in range(3)]).astype("uint8")) +bg_b.save(os.path.join("../temp_images", "b.png")) + +down_bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_w[i] for i in range(3)]).astype("uint8")) +down_bg_w.save(os.path.join("../temp_images", "down_w.png")) +down_bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_b[i] for i in range(3)]).astype("uint8")) +down_bg_b.save(os.path.join("../temp_images", "down_b.png")) + From ad4895b9d9c4c2270bc82ad99349cc03942f88dc Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Fri, 29 Dec 2023 12:44:12 +0100 Subject: [PATCH 08/13] ADD: command line for colorization --- README.md | 16 +++++ pyalapin/interface/colorize.py | 116 ++++++++++++++++++++++++++++++++ pyalapin/interface/interface.py | 23 +------ 3 files changed, 133 insertions(+), 22 deletions(-) create mode 100644 pyalapin/interface/colorize.py diff --git a/README.md b/README.md index 8a9e259..aa38430 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,19 @@ game.move_from_coordinates(game.player2, 6, 2, 4, 2) game.move_from_coordinates(game.player2, 2, 5, 6, 5) ``` There are colors in the command line not showing here in the GIF, though... + +## How to change interface colors + +With line command: +```bash +python interface/colorize.py -ccb 0 191 255 -ccw 207 185 151 -ibp 109 7 26 -obp 0 0 0 -iwp 200 200 200 -owp 255 255 255 +``` +Arguments are: +- -ccb/--color_cell_black: RGB, default 0, 191, 255 +- -ccw/--color_cell_white: RGB, default 207, 185, 151 +- -ibp/--inner_black_piece: RGB, default 109, 7, 26 +- -obp/--outer_black_piece: RGB, default 0, 0, 0 +- -iwp/--inner_white_piece: RGB, default 200, 200, 200 +- -owp/--outer_white_piece: RGB, default 255, 255, 255 + +The command creates (or replaces) the illustrations that are in the temp_images/ folder. If the folder exists, the interface uses theses illustrations. Destroy it to come back to standard illustrations. diff --git a/pyalapin/interface/colorize.py b/pyalapin/interface/colorize.py new file mode 100644 index 0000000..9601937 --- /dev/null +++ b/pyalapin/interface/colorize.py @@ -0,0 +1,116 @@ +import argparse +import os + +from PIL import Image +import numpy as np + + +def color_one_img(pil_img, background_color, border_color, inner_color): + img = np.array(pil_img) + x_min = np.min(np.where(img==255)[0]) + x_max = np.max(np.where(img==255)[0]) + img = img[x_min:x_max] + + + r_dict = {0:background_color[0], 128: inner_color[0], 255: border_color[0]} + g_dict = {0:background_color[1], 128: inner_color[1], 255: border_color[1]} + b_dict = {0:background_color[2], 128: inner_color[2], 255: border_color[2]} + + img = [np.vectorize(r_dict.get)(img), + np.vectorize(g_dict.get)(img), + np.vectorize(b_dict.get)(img)] + img = np.dstack(img) + + img = Image.fromarray(img.astype("uint8")) + + img = img.resize((int(img.size[0]/img.size[1]*450), 450)) + + x_coordinate = int((500 - img.size[0]) / 2) + y_coordinate = 25 + + background = np.dstack([np.ones((500, 500))*background_color[i] for i in range(3)]).astype("uint8") + background = Image.fromarray(background) + background.paste(img, (x_coordinate, y_coordinate)) + return background + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument("-ccb", "--color_cell_black", nargs='+') + parser.add_argument("-ccw", "--color_cell_white", nargs='+') + + parser.add_argument("-ibp", "--inner_black_piece", nargs='+') + parser.add_argument("-obp", "--outer_black_piece", nargs='+') + + parser.add_argument("-iwp", "--inner_white_piece", nargs='+') + parser.add_argument("-owp", "--outer_white_piece", nargs='+') + + + args = parser.parse_args() + + if args.color_cell_black is None: + color_cell_b = [0, 191, 255] + else: + color_cell_b = [int(i) for i in args.color_cell_black] + + if args.color_cell_white is None: + color_cell_w = [207, 185, 151] + else: + color_cell_w = [int(i) for i in args.color_cell_white] + + if args.inner_black_piece is None: + inner_color_b = [109, 7, 26] + else: + inner_color_b = [int(i) for i in args.inner_black_piece] + if args.outer_black_piece is None: + border_color_b = [0, 0, 0] + else: + border_color_b = [int(i) for i in args.outer_black_piece] + + if args.inner_white_piece is None: + inner_color_w = [200, 200, 200] + else: + inner_color_w = [int(i) for i in args.inner_white_piece] + if args.outer_white_piece is None: + border_color_w = [255, 255, 255] + else: + border_color_w = [int(i) for i in args.outer_white_piece] + + down_color_cell_b = np.clip(np.array(color_cell_b) - 70, 0, 255) + down_color_cell_w = np.clip(np.array(color_cell_w) - 70, 0, 255) + + + for img_name in os.listdir("../gs_illustrations"): + img = Image.open(os.path.join("../gs_illustrations", img_name)) + img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) + img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) + img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) + img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) + + down_img_bb = color_one_img(img, down_color_cell_b, border_color_b, inner_color_b) + down_img_ww = color_one_img(img, down_color_cell_w, border_color_w, inner_color_w) + down_img_wb = color_one_img(img, down_color_cell_w, border_color_b, inner_color_b) + down_img_bw = color_one_img(img, down_color_cell_b, border_color_w, inner_color_w) + + name = img_name.split("_")[0] + name = {"pawn": "P", "bishop": "B", "knight": "N", "rook": "R", "queen": "Q", "king": "K"}[name] + img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) + img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) + img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) + img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) + + down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) + down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) + down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) + down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) + + bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_w[i] for i in range(3)]).astype("uint8")) + bg_w.save(os.path.join("../temp_images", "w.png")) + bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_b[i] for i in range(3)]).astype("uint8")) + bg_b.save(os.path.join("../temp_images", "b.png")) + + down_bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_w[i] for i in range(3)]).astype("uint8")) + down_bg_w.save(os.path.join("../temp_images", "down_w.png")) + down_bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_b[i] for i in range(3)]).astype("uint8")) + down_bg_b.save(os.path.join("../temp_images", "down_b.png")) + diff --git a/pyalapin/interface/interface.py b/pyalapin/interface/interface.py index d41d332..a0dac99 100644 --- a/pyalapin/interface/interface.py +++ b/pyalapin/interface/interface.py @@ -14,27 +14,6 @@ from pyalapin.engine.engine import ChessGame -class LoginScreen(GridLayout): - def __init__(self, **kwargs): - """ - Base class for a Login Screen, not used yet - """ - super(LoginScreen, self).__init__(**kwargs) - self.cols = 8 - self.add_widget(Label(text="")) - self.username = TextInput(multiline=False) - self.add_widget(self.username) - self.add_widget(Label(text="password")) - self.password = TextInput(password=True, multiline=False) - self.add_widget(self.password) - - self.add_widget(Label(text="password2")) - self.password2 = TextInput(password=True, multiline=False) - self.add_widget(self.password2) - - self.add_widget(Rectangle(pos=(10, 10), size=(500, 500))) - - class DisplayableCell(Button): """Base class to represent a Cell as Button""" @@ -398,7 +377,7 @@ def click_cell(self, event): class ChessApp(App): """ - Main app to use to play game, by calling MyApp().buil() and then player. + Main app to use to play game, by calling ChessApp().build() and then players. """ def __init__(self, play_with_ai=False, **kwargs): From abada2556884353158c36943039e665def7d7be3 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Fri, 29 Dec 2023 12:44:26 +0100 Subject: [PATCH 09/13] ENH: .gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 11a3155..6c91511 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,7 @@ venv/ .idea/ .DS_Store __pycache__/ + +.pstats +*.egg-info/ +dist/ From 1eede27f93f61ede64266561a8a016a572b4d892 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Fri, 29 Dec 2023 16:27:24 +0100 Subject: [PATCH 10/13] Lint --- settings.py | 21 ++++---- utils/create_base.py | 37 ++++++------- utils/create_figures.py | 117 ++++++++++++++++++++++++---------------- 3 files changed, 99 insertions(+), 76 deletions(-) diff --git a/settings.py b/settings.py index f343b83..1b915ac 100644 --- a/settings.py +++ b/settings.py @@ -1,12 +1,11 @@ settings = { - "stockfish_path": "/Users/vincent.auriau/Python/stockfish/bin/stockfish", - - "grayscale_images": { - "pawn": "gs_illustrations/pawn_gray.png", - "bishop": "gs_illustrations/bishop_gray.png", - "knight": "gs_illustrations/knight_gray.png", - "rook": "gs_illustrations/rook_gray.png", - "king": "gs_illustrations/king_gray.png", - "queen": "gs_illustrations/queen_gray.png", - }, -} \ No newline at end of file + "stockfish_path": "/Users/vincent.auriau/Python/stockfish/bin/stockfish", + "grayscale_images": { + "pawn": "gs_illustrations/pawn_gray.png", + "bishop": "gs_illustrations/bishop_gray.png", + "knight": "gs_illustrations/knight_gray.png", + "rook": "gs_illustrations/rook_gray.png", + "king": "gs_illustrations/king_gray.png", + "queen": "gs_illustrations/queen_gray.png", + }, +} diff --git a/utils/create_base.py b/utils/create_base.py index 54a6099..4bb1de1 100644 --- a/utils/create_base.py +++ b/utils/create_base.py @@ -127,16 +127,16 @@ black_pawn = black_pawn[:, :, :3] for h in range(len(black_pawn)): - row = black_pawn[h] - for w in range(len(row)): - pix = row[w] - for i in range(len(pix)): - if pix[i] in list(range(116, 165)): - black_pawn[h][w][i] = 255 - elif pix[i] == 255 or pix[i] == 0: - pix[i] = 0 - else: - pix[i] = 128 * (i == 0) + row = black_pawn[h] + for w in range(len(row)): + pix = row[w] + for i in range(len(pix)): + if pix[i] in list(range(116, 165)): + black_pawn[h][w][i] = 255 + elif pix[i] == 255 or pix[i] == 0: + pix[i] = 0 + else: + pix[i] = 128 * (i == 0) plt.imshow(black_pawn[:, :, :3]) plt.show() @@ -145,16 +145,17 @@ img.save("../gs_illustrations/queen_grey.png") print(black_pawn) -r_dict = {0:0, 128: 255, 255: 175} -g_dict = {0:0, 128: 192, 255: 238} -b_dict = {0:0, 128: 203, 255: 238} -own_pawn = [np.vectorize(r_dict.get)(black_pawn[:, :, 0].astype("uint8")), -np.vectorize(g_dict.get)(black_pawn[:, :, 0]), -np.vectorize(b_dict.get)(black_pawn[:, :, 0])] +r_dict = {0: 0, 128: 255, 255: 175} +g_dict = {0: 0, 128: 192, 255: 238} +b_dict = {0: 0, 128: 203, 255: 238} +own_pawn = [ + np.vectorize(r_dict.get)(black_pawn[:, :, 0].astype("uint8")), + np.vectorize(g_dict.get)(black_pawn[:, :, 0]), + np.vectorize(b_dict.get)(black_pawn[:, :, 0]), +] own_pawn = np.dstack(own_pawn) rose = 255, 192, 203 -turq = 175,238,238 +turq = 175, 238, 238 print(own_pawn) plt.imshow(own_pawn) plt.show() - diff --git a/utils/create_figures.py b/utils/create_figures.py index de2d01f..8fb6c3f 100644 --- a/utils/create_figures.py +++ b/utils/create_figures.py @@ -14,65 +14,88 @@ down_color_cell_b = np.clip(np.array(color_cell_b) - 70, 0, 255) down_color_cell_w = np.clip(np.array(color_cell_w) - 70, 0, 255) + def color_one_img(pil_img, background_color, border_color, inner_color): - img = np.array(pil_img) - x_min = np.min(np.where(img==255)[0]) - x_max = np.max(np.where(img==255)[0]) - img = img[x_min:x_max] + img = np.array(pil_img) + x_min = np.min(np.where(img == 255)[0]) + x_max = np.max(np.where(img == 255)[0]) + img = img[x_min:x_max] + r_dict = {0: background_color[0], 128: inner_color[0], 255: border_color[0]} + g_dict = {0: background_color[1], 128: inner_color[1], 255: border_color[1]} + b_dict = {0: background_color[2], 128: inner_color[2], 255: border_color[2]} - r_dict = {0:background_color[0], 128: inner_color[0], 255: border_color[0]} - g_dict = {0:background_color[1], 128: inner_color[1], 255: border_color[1]} - b_dict = {0:background_color[2], 128: inner_color[2], 255: border_color[2]} + img = [ + np.vectorize(r_dict.get)(img), + np.vectorize(g_dict.get)(img), + np.vectorize(b_dict.get)(img), + ] + img = np.dstack(img) - img = [np.vectorize(r_dict.get)(img), - np.vectorize(g_dict.get)(img), - np.vectorize(b_dict.get)(img)] - img = np.dstack(img) + img = Image.fromarray(img.astype("uint8")) - img = Image.fromarray(img.astype("uint8")) + img = img.resize((int(img.size[0] / img.size[1] * 450), 450)) - img = img.resize((int(img.size[0]/img.size[1]*450), 450)) + x_coordinate = int((500 - img.size[0]) / 2) + y_coordinate = 25 - x_coordinate = int((500 - img.size[0]) / 2) - y_coordinate = 25 + background = np.dstack( + [np.ones((500, 500)) * background_color[i] for i in range(3)] + ).astype("uint8") + background = Image.fromarray(background) + background.paste(img, (x_coordinate, y_coordinate)) + return background - background = np.dstack([np.ones((500, 500))*background_color[i] for i in range(3)]).astype("uint8") - background = Image.fromarray(background) - background.paste(img, (x_coordinate, y_coordinate)) - return background for img_name in os.listdir("../gs_illustrations"): - img = Image.open(os.path.join("../gs_illustrations", img_name)) - img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) - img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) - img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) - img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) - - down_img_bb = color_one_img(img, down_color_cell_b, border_color_b, inner_color_b) - down_img_ww = color_one_img(img, down_color_cell_w, border_color_w, inner_color_w) - down_img_wb = color_one_img(img, down_color_cell_w, border_color_b, inner_color_b) - down_img_bw = color_one_img(img, down_color_cell_b, border_color_w, inner_color_w) - - name = img_name.split("_")[0] - name = {"pawn": "P", "bishop": "B", "knight": "N", "rook": "R", "queen": "Q", "king": "K"}[name] - img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) - img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) - img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) - img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) - - down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) - down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) - down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) - down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) - -bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_w[i] for i in range(3)]).astype("uint8")) + img = Image.open(os.path.join("../gs_illustrations", img_name)) + img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) + img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) + img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) + img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) + + down_img_bb = color_one_img(img, down_color_cell_b, border_color_b, inner_color_b) + down_img_ww = color_one_img(img, down_color_cell_w, border_color_w, inner_color_w) + down_img_wb = color_one_img(img, down_color_cell_w, border_color_b, inner_color_b) + down_img_bw = color_one_img(img, down_color_cell_b, border_color_w, inner_color_w) + + name = img_name.split("_")[0] + name = { + "pawn": "P", + "bishop": "B", + "knight": "N", + "rook": "R", + "queen": "Q", + "king": "K", + }[name] + img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) + img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) + img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) + img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) + + down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) + down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) + down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) + down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) + +bg_w = Image.fromarray( + np.dstack([np.ones((500, 500)) * color_cell_w[i] for i in range(3)]).astype("uint8") +) bg_w.save(os.path.join("../temp_images", "w.png")) -bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_b[i] for i in range(3)]).astype("uint8")) +bg_b = Image.fromarray( + np.dstack([np.ones((500, 500)) * color_cell_b[i] for i in range(3)]).astype("uint8") +) bg_b.save(os.path.join("../temp_images", "b.png")) -down_bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_w[i] for i in range(3)]).astype("uint8")) +down_bg_w = Image.fromarray( + np.dstack([np.ones((500, 500)) * down_color_cell_w[i] for i in range(3)]).astype( + "uint8" + ) +) down_bg_w.save(os.path.join("../temp_images", "down_w.png")) -down_bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_b[i] for i in range(3)]).astype("uint8")) +down_bg_b = Image.fromarray( + np.dstack([np.ones((500, 500)) * down_color_cell_b[i] for i in range(3)]).astype( + "uint8" + ) +) down_bg_b.save(os.path.join("../temp_images", "down_b.png")) - From b4e898ad7939ab485568eed4abdb986555e8a45b Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Fri, 29 Dec 2023 16:35:38 +0100 Subject: [PATCH 11/13] ENH: readme --- README.md | 3 +- pyalapin/interface/colorize.py | 228 +++++++++++++++++++-------------- 2 files changed, 132 insertions(+), 99 deletions(-) diff --git a/README.md b/README.md index 9874291..4a89454 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,8 @@ There are colors in the command line not showing here in the GIF, though... ## How to change interface colors -With line command: +With line command you can create new illustrations by specifying the RGB colors you want. You can specify the colors of the cells and of the pieces (outer and inner colors). +Use the following command with the colors you want: ```bash python interface/colorize.py -ccb 0 191 255 -ccw 207 185 151 -ibp 109 7 26 -obp 0 0 0 -iwp 200 200 200 -owp 255 255 255 ``` diff --git a/pyalapin/interface/colorize.py b/pyalapin/interface/colorize.py index 9601937..848a83a 100644 --- a/pyalapin/interface/colorize.py +++ b/pyalapin/interface/colorize.py @@ -6,111 +6,143 @@ def color_one_img(pil_img, background_color, border_color, inner_color): - img = np.array(pil_img) - x_min = np.min(np.where(img==255)[0]) - x_max = np.max(np.where(img==255)[0]) - img = img[x_min:x_max] + img = np.array(pil_img) + x_min = np.min(np.where(img == 255)[0]) + x_max = np.max(np.where(img == 255)[0]) + img = img[x_min:x_max] + r_dict = {0: background_color[0], 128: inner_color[0], 255: border_color[0]} + g_dict = {0: background_color[1], 128: inner_color[1], 255: border_color[1]} + b_dict = {0: background_color[2], 128: inner_color[2], 255: border_color[2]} - r_dict = {0:background_color[0], 128: inner_color[0], 255: border_color[0]} - g_dict = {0:background_color[1], 128: inner_color[1], 255: border_color[1]} - b_dict = {0:background_color[2], 128: inner_color[2], 255: border_color[2]} + img = [ + np.vectorize(r_dict.get)(img), + np.vectorize(g_dict.get)(img), + np.vectorize(b_dict.get)(img), + ] + img = np.dstack(img) - img = [np.vectorize(r_dict.get)(img), - np.vectorize(g_dict.get)(img), - np.vectorize(b_dict.get)(img)] - img = np.dstack(img) + img = Image.fromarray(img.astype("uint8")) - img = Image.fromarray(img.astype("uint8")) + img = img.resize((int(img.size[0] / img.size[1] * 450), 450)) - img = img.resize((int(img.size[0]/img.size[1]*450), 450)) + x_coordinate = int((500 - img.size[0]) / 2) + y_coordinate = 25 - x_coordinate = int((500 - img.size[0]) / 2) - y_coordinate = 25 + background = np.dstack( + [np.ones((500, 500)) * background_color[i] for i in range(3)] + ).astype("uint8") + background = Image.fromarray(background) + background.paste(img, (x_coordinate, y_coordinate)) + return background - background = np.dstack([np.ones((500, 500))*background_color[i] for i in range(3)]).astype("uint8") - background = Image.fromarray(background) - background.paste(img, (x_coordinate, y_coordinate)) - return background if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("-ccb", "--color_cell_black", nargs='+') - parser.add_argument("-ccw", "--color_cell_white", nargs='+') - - parser.add_argument("-ibp", "--inner_black_piece", nargs='+') - parser.add_argument("-obp", "--outer_black_piece", nargs='+') - - parser.add_argument("-iwp", "--inner_white_piece", nargs='+') - parser.add_argument("-owp", "--outer_white_piece", nargs='+') - - - args = parser.parse_args() - - if args.color_cell_black is None: - color_cell_b = [0, 191, 255] - else: - color_cell_b = [int(i) for i in args.color_cell_black] - - if args.color_cell_white is None: - color_cell_w = [207, 185, 151] - else: - color_cell_w = [int(i) for i in args.color_cell_white] - - if args.inner_black_piece is None: - inner_color_b = [109, 7, 26] - else: - inner_color_b = [int(i) for i in args.inner_black_piece] - if args.outer_black_piece is None: - border_color_b = [0, 0, 0] - else: - border_color_b = [int(i) for i in args.outer_black_piece] - - if args.inner_white_piece is None: - inner_color_w = [200, 200, 200] - else: - inner_color_w = [int(i) for i in args.inner_white_piece] - if args.outer_white_piece is None: - border_color_w = [255, 255, 255] - else: - border_color_w = [int(i) for i in args.outer_white_piece] - - down_color_cell_b = np.clip(np.array(color_cell_b) - 70, 0, 255) - down_color_cell_w = np.clip(np.array(color_cell_w) - 70, 0, 255) - - - for img_name in os.listdir("../gs_illustrations"): - img = Image.open(os.path.join("../gs_illustrations", img_name)) - img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) - img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) - img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) - img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) - - down_img_bb = color_one_img(img, down_color_cell_b, border_color_b, inner_color_b) - down_img_ww = color_one_img(img, down_color_cell_w, border_color_w, inner_color_w) - down_img_wb = color_one_img(img, down_color_cell_w, border_color_b, inner_color_b) - down_img_bw = color_one_img(img, down_color_cell_b, border_color_w, inner_color_w) - - name = img_name.split("_")[0] - name = {"pawn": "P", "bishop": "B", "knight": "N", "rook": "R", "queen": "Q", "king": "K"}[name] - img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) - img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) - img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) - img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) - - down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) - down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) - down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) - down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) - - bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_w[i] for i in range(3)]).astype("uint8")) - bg_w.save(os.path.join("../temp_images", "w.png")) - bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*color_cell_b[i] for i in range(3)]).astype("uint8")) - bg_b.save(os.path.join("../temp_images", "b.png")) - - down_bg_w = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_w[i] for i in range(3)]).astype("uint8")) - down_bg_w.save(os.path.join("../temp_images", "down_w.png")) - down_bg_b = Image.fromarray(np.dstack([np.ones((500, 500))*down_color_cell_b[i] for i in range(3)]).astype("uint8")) - down_bg_b.save(os.path.join("../temp_images", "down_b.png")) - + parser = argparse.ArgumentParser() + parser.add_argument("-ccb", "--color_cell_black", nargs="+") + parser.add_argument("-ccw", "--color_cell_white", nargs="+") + + parser.add_argument("-ibp", "--inner_black_piece", nargs="+") + parser.add_argument("-obp", "--outer_black_piece", nargs="+") + + parser.add_argument("-iwp", "--inner_white_piece", nargs="+") + parser.add_argument("-owp", "--outer_white_piece", nargs="+") + + args = parser.parse_args() + + if args.color_cell_black is None: + color_cell_b = [0, 191, 255] + else: + color_cell_b = [int(i) for i in args.color_cell_black] + + if args.color_cell_white is None: + color_cell_w = [207, 185, 151] + else: + color_cell_w = [int(i) for i in args.color_cell_white] + + if args.inner_black_piece is None: + inner_color_b = [109, 7, 26] + else: + inner_color_b = [int(i) for i in args.inner_black_piece] + if args.outer_black_piece is None: + border_color_b = [0, 0, 0] + else: + border_color_b = [int(i) for i in args.outer_black_piece] + + if args.inner_white_piece is None: + inner_color_w = [200, 200, 200] + else: + inner_color_w = [int(i) for i in args.inner_white_piece] + if args.outer_white_piece is None: + border_color_w = [255, 255, 255] + else: + border_color_w = [int(i) for i in args.outer_white_piece] + + down_color_cell_b = np.clip(np.array(color_cell_b) - 70, 0, 255) + down_color_cell_w = np.clip(np.array(color_cell_w) - 70, 0, 255) + + for img_name in os.listdir("../gs_illustrations"): + img = Image.open(os.path.join("../gs_illustrations", img_name)) + img_bb = color_one_img(img, color_cell_b, border_color_b, inner_color_b) + img_ww = color_one_img(img, color_cell_w, border_color_w, inner_color_w) + img_wb = color_one_img(img, color_cell_w, border_color_b, inner_color_b) + img_bw = color_one_img(img, color_cell_b, border_color_w, inner_color_w) + + down_img_bb = color_one_img( + img, down_color_cell_b, border_color_b, inner_color_b + ) + down_img_ww = color_one_img( + img, down_color_cell_w, border_color_w, inner_color_w + ) + down_img_wb = color_one_img( + img, down_color_cell_w, border_color_b, inner_color_b + ) + down_img_bw = color_one_img( + img, down_color_cell_b, border_color_w, inner_color_w + ) + + name = img_name.split("_")[0] + name = { + "pawn": "P", + "bishop": "B", + "knight": "N", + "rook": "R", + "queen": "Q", + "king": "K", + }[name] + img_bb.save(os.path.join("../temp_images", f"bb_{name}.png")) + img_bw.save(os.path.join("../temp_images", f"bw_{name}.png")) + img_wb.save(os.path.join("../temp_images", f"wb_{name}.png")) + img_ww.save(os.path.join("../temp_images", f"ww_{name}.png")) + + down_img_bb.save(os.path.join("../temp_images", f"down_bb_{name}.png")) + down_img_bw.save(os.path.join("../temp_images", f"down_bw_{name}.png")) + down_img_wb.save(os.path.join("../temp_images", f"down_wb_{name}.png")) + down_img_ww.save(os.path.join("../temp_images", f"down_ww_{name}.png")) + + bg_w = Image.fromarray( + np.dstack([np.ones((500, 500)) * color_cell_w[i] for i in range(3)]).astype( + "uint8" + ) + ) + bg_w.save(os.path.join("../temp_images", "w.png")) + bg_b = Image.fromarray( + np.dstack([np.ones((500, 500)) * color_cell_b[i] for i in range(3)]).astype( + "uint8" + ) + ) + bg_b.save(os.path.join("../temp_images", "b.png")) + + down_bg_w = Image.fromarray( + np.dstack( + [np.ones((500, 500)) * down_color_cell_w[i] for i in range(3)] + ).astype("uint8") + ) + down_bg_w.save(os.path.join("../temp_images", "down_w.png")) + down_bg_b = Image.fromarray( + np.dstack( + [np.ones((500, 500)) * down_color_cell_b[i] for i in range(3)] + ).astype("uint8") + ) + down_bg_b.save(os.path.join("../temp_images", "down_b.png")) From ee638c2b9ddb45faea26431e18b841703331c8a8 Mon Sep 17 00:00:00 2001 From: VincentAURIAU Date: Fri, 29 Dec 2023 16:39:43 +0100 Subject: [PATCH 12/13] another linting commit --- pyalapin/interface/color_edition.py | 315 ++++++++++++++++++---------- 1 file changed, 200 insertions(+), 115 deletions(-) diff --git a/pyalapin/interface/color_edition.py b/pyalapin/interface/color_edition.py index c5a8dfe..8172e82 100644 --- a/pyalapin/interface/color_edition.py +++ b/pyalapin/interface/color_edition.py @@ -3,119 +3,204 @@ from settings import settings -class ColorEditor(object): - def __init__(self, - white_cell, - down_white_cell, - black_cell, - down_black_cell, - white_piece_fill, - white_piece_border, - black_piece_fill, - black_piece_border): - - self.white_cell = white_cell - self.down_white_cell = down_white_cell - self.black_cell = black_cell - self.down_black_cell = down_black_cell - self.white_piece_fill = white_piece_fill - self.white_piece_border = white_piece_border - self.black_piece_fill = black_piece_fill - self.black_piece_border = black_piece_border - - def get_edited_black_cell(self): - return np.array([[self.black_cell] * 64] * 64), np.array([[self.down_black_cell] * 64] * 64) - - def get_edited_white_cell(self): - return np.array([[self.white_cell] * 64] * 64), np.array([[self.down_white_cell] * 64] * 64) - - def get_edited_black_material(self, material_type, cell_color): - if cell_color == "black": - cell_color = self.black_cell - else: - cell_color = self.white_cell - - image = Image.open(settings["grayscale_images"][material_type]) - r_map = {0: cell_color[0], 128: self.black_piece_fill[0], 255: self.black_piece_border[0]} - g_map = {0: cell_color[1], 128: self.black_piece_fill[1], 255: self.black_piece_border[1]} - b_map = {0: cell_color[2], 128: self.black_piece_fill[2], 255: self.black_piece_border[2]} - - edited_img = np.array(image) - edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), - np.vectorize(g_map.get)(edited_img), - np.vectorize(b_map.get)(edited_img)]) - - if cell_color == "black": - cell_color = self.down_black_cell - else: - cell_color = self.down_white_cell - - r_map = {0: cell_color[0], 128: self.black_piece_fill[0], 255: self.black_piece_border[0]} - g_map = {0: cell_color[1], 128: self.black_piece_fill[1], 255: self.black_piece_border[1]} - b_map = {0: cell_color[2], 128: self.black_piece_fill[2], 255: self.black_piece_border[2]} - - down_edited_img = np.array(image) - down_edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), - np.vectorize(g_map.get)(edited_img), - np.vectorize(b_map.get)(edited_img)]) - - return edited_img, down_edited_img - - def get_edited_white_material(self, material_type, cell_color): - if cell_color == "black": - cell_color = self.black_cell - else: - cell_color = self.white_cell - - image = Image.open(settings["grayscale_images"][material_type]) - r_map = {0: cell_color[0], 128: self.white_piece_fill[0], 255: self.white_piece_border[0]} - g_map = {0: cell_color[1], 128: self.white_piece_fill[1], 255: self.white_piece_border[1]} - b_map = {0: cell_color[2], 128: self.white_piece_fill[2], 255: self.white_piece_border[2]} - - edited_img = np.array(image) - edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), - np.vectorize(g_map.get)(edited_img), - np.vectorize(b_map.get)(edited_img)]) - - if cell_color == "black": - cell_color = self.down_black_cell - else: - cell_color = self.down_white_cell - - r_map = {0: cell_color[0], 128: self.white_piece_fill[0], 255: self.white_piece_border[0]} - g_map = {0: cell_color[1], 128: self.white_piece_fill[1], 255: self.white_piece_border[1]} - b_map = {0: cell_color[2], 128: self.white_piece_fill[2], 255: self.white_piece_border[2]} - - down_edited_img = np.array(image) - down_edited_img = np.dstack([np.vectorize(r_map.get)(edited_img), - np.vectorize(g_map.get)(edited_img), - np.vectorize(b_map.get)(edited_img)]) - - return edited_img - - - def generate_all_images(self, path="temp_illustrations"): - b, down_b = self.get_edited_black_cell() - Image.from_array(b).save(os.path.join(path, "b.png")) - Image.from_array(down_b).save(os.path.join(path, "down_b.png")) - w, down_w = self.get_edited_black_cell() - Image.from_array(w).save(os.path.join(path, "w.png")) - Image.from_array(down_w).save(os.path.join(path, "down_w.png")) - for piece in ["pawn", "bishop", "knight", "rook", "king", "queen"]: - wb_p, down_wb_p = self.get_edited_black_material(material_type=piece, "white") - bb_p, down_bb_p = self.get_edited_black_material(material_type=piece, "black") - ww_p, down_ww_p = self.get_edited_white_material(material_type=piece, "white") - bw_p, down_bw_p = self.get_edited_white_material(material_type=piece, "black") - prefix = "N" if piece == "knight" else piece[0].upper() - Image.from_array(wb_p).save(os.path.join(path, f"wb_{prefix}.png")) - Image.from_array(down_wb_p).save(os.path.join(path, f"down_wb_{prefix}.png")) - - Image.from_array(bb_p).save(os.path.join(path, f"bb_{prefix}.png")) - Image.from_array(down_bb_p).save(os.path.join(path, f"down_bb_{prefix}.png")) - - Image.from_array(ww_p).save(os.path.join(path, f"ww_{prefix}.png")) - Image.from_array(down_ww_p).save(os.path.join(path, f"down_ww_{prefix}.png")) - - Image.from_array(bw_p).save(os.path.join(path, f"bw_{prefix}.png")) - Image.from_array(down_bw_p).save(os.path.join(path, f"down_bw_{prefix}.png")) +class ColorEditor(object): + def __init__( + self, + white_cell, + down_white_cell, + black_cell, + down_black_cell, + white_piece_fill, + white_piece_border, + black_piece_fill, + black_piece_border, + ): + + self.white_cell = white_cell + self.down_white_cell = down_white_cell + self.black_cell = black_cell + self.down_black_cell = down_black_cell + self.white_piece_fill = white_piece_fill + self.white_piece_border = white_piece_border + self.black_piece_fill = black_piece_fill + self.black_piece_border = black_piece_border + + def get_edited_black_cell(self): + return np.array([[self.black_cell] * 64] * 64), np.array( + [[self.down_black_cell] * 64] * 64 + ) + + def get_edited_white_cell(self): + return np.array([[self.white_cell] * 64] * 64), np.array( + [[self.down_white_cell] * 64] * 64 + ) + + def get_edited_black_material(self, material_type, cell_color): + if cell_color == "black": + cell_color = self.black_cell + else: + cell_color = self.white_cell + + image = Image.open(settings["grayscale_images"][material_type]) + r_map = { + 0: cell_color[0], + 128: self.black_piece_fill[0], + 255: self.black_piece_border[0], + } + g_map = { + 0: cell_color[1], + 128: self.black_piece_fill[1], + 255: self.black_piece_border[1], + } + b_map = { + 0: cell_color[2], + 128: self.black_piece_fill[2], + 255: self.black_piece_border[2], + } + + edited_img = np.array(image) + edited_img = np.dstack( + [ + np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img), + ] + ) + + if cell_color == "black": + cell_color = self.down_black_cell + else: + cell_color = self.down_white_cell + + r_map = { + 0: cell_color[0], + 128: self.black_piece_fill[0], + 255: self.black_piece_border[0], + } + g_map = { + 0: cell_color[1], + 128: self.black_piece_fill[1], + 255: self.black_piece_border[1], + } + b_map = { + 0: cell_color[2], + 128: self.black_piece_fill[2], + 255: self.black_piece_border[2], + } + + down_edited_img = np.array(image) + down_edited_img = np.dstack( + [ + np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img), + ] + ) + + return edited_img, down_edited_img + + def get_edited_white_material(self, material_type, cell_color): + if cell_color == "black": + cell_color = self.black_cell + else: + cell_color = self.white_cell + + image = Image.open(settings["grayscale_images"][material_type]) + r_map = { + 0: cell_color[0], + 128: self.white_piece_fill[0], + 255: self.white_piece_border[0], + } + g_map = { + 0: cell_color[1], + 128: self.white_piece_fill[1], + 255: self.white_piece_border[1], + } + b_map = { + 0: cell_color[2], + 128: self.white_piece_fill[2], + 255: self.white_piece_border[2], + } + + edited_img = np.array(image) + edited_img = np.dstack( + [ + np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img), + ] + ) + + if cell_color == "black": + cell_color = self.down_black_cell + else: + cell_color = self.down_white_cell + + r_map = { + 0: cell_color[0], + 128: self.white_piece_fill[0], + 255: self.white_piece_border[0], + } + g_map = { + 0: cell_color[1], + 128: self.white_piece_fill[1], + 255: self.white_piece_border[1], + } + b_map = { + 0: cell_color[2], + 128: self.white_piece_fill[2], + 255: self.white_piece_border[2], + } + + down_edited_img = np.array(image) + down_edited_img = np.dstack( + [ + np.vectorize(r_map.get)(edited_img), + np.vectorize(g_map.get)(edited_img), + np.vectorize(b_map.get)(edited_img), + ] + ) + + return edited_img + + def generate_all_images(self, path="temp_illustrations"): + b, down_b = self.get_edited_black_cell() + Image.from_array(b).save(os.path.join(path, "b.png")) + Image.from_array(down_b).save(os.path.join(path, "down_b.png")) + w, down_w = self.get_edited_black_cell() + Image.from_array(w).save(os.path.join(path, "w.png")) + Image.from_array(down_w).save(os.path.join(path, "down_w.png")) + for piece in ["pawn", "bishop", "knight", "rook", "king", "queen"]: + wb_p, down_wb_p = self.get_edited_black_material( + material_type=piece, cell_color="white" + ) + bb_p, down_bb_p = self.get_edited_black_material( + material_type=piece, cell_color="black" + ) + ww_p, down_ww_p = self.get_edited_white_material( + material_type=piece, cell_color="white" + ) + bw_p, down_bw_p = self.get_edited_white_material( + material_type=piece, cell_color="black" + ) + prefix = "N" if piece == "knight" else piece[0].upper() + Image.from_array(wb_p).save(os.path.join(path, f"wb_{prefix}.png")) + Image.from_array(down_wb_p).save( + os.path.join(path, f"down_wb_{prefix}.png") + ) + + Image.from_array(bb_p).save(os.path.join(path, f"bb_{prefix}.png")) + Image.from_array(down_bb_p).save( + os.path.join(path, f"down_bb_{prefix}.png") + ) + + Image.from_array(ww_p).save(os.path.join(path, f"ww_{prefix}.png")) + Image.from_array(down_ww_p).save( + os.path.join(path, f"down_ww_{prefix}.png") + ) + + Image.from_array(bw_p).save(os.path.join(path, f"bw_{prefix}.png")) + Image.from_array(down_bw_p).save( + os.path.join(path, f"down_bw_{prefix}.png") + ) From ad4242b0db275c2463fcec08f8c0c099d0c119f8 Mon Sep 17 00:00:00 2001 From: VincentAuriau Date: Fri, 29 Dec 2023 15:40:26 +0000 Subject: [PATCH 13/13] :art: Format Python code with psf/black --- pyalapin/interface/color_edition.py | 1 - pyalapin/interface/colorize.py | 1 - 2 files changed, 2 deletions(-) diff --git a/pyalapin/interface/color_edition.py b/pyalapin/interface/color_edition.py index 8172e82..b6dd1f8 100644 --- a/pyalapin/interface/color_edition.py +++ b/pyalapin/interface/color_edition.py @@ -16,7 +16,6 @@ def __init__( black_piece_fill, black_piece_border, ): - self.white_cell = white_cell self.down_white_cell = down_white_cell self.black_cell = black_cell diff --git a/pyalapin/interface/colorize.py b/pyalapin/interface/colorize.py index 848a83a..90f0e52 100644 --- a/pyalapin/interface/colorize.py +++ b/pyalapin/interface/colorize.py @@ -38,7 +38,6 @@ def color_one_img(pil_img, background_color, border_color, inner_color): if __name__ == "__main__": - parser = argparse.ArgumentParser() parser.add_argument("-ccb", "--color_cell_black", nargs="+") parser.add_argument("-ccw", "--color_cell_white", nargs="+")