From eeb3b480bcc2455b075e34b9a68c3ce194685ab3 Mon Sep 17 00:00:00 2001 From: Keplyx Date: Mon, 23 Apr 2018 09:52:46 +0200 Subject: [PATCH] Added thumbnails support and script to create them --- assets/css/photos.css | 4 +- assets/scripts/photosScript.js | 17 ++- photos.php | 2 +- photos/2016/album1/chicken silouhette.bmp | Bin 1216298 -> 0 bytes photos/2018/album1/chicken silouhette.bmp | Bin 1216298 -> 0 bytes photos/2018/album1/chicken silouhette2.bmp | Bin 1216298 -> 0 bytes photos/compress.py | 78 ----------- photos/compress_photos.py | 145 +++++++++++++++++++++ 8 files changed, 160 insertions(+), 86 deletions(-) delete mode 100755 photos/2016/album1/chicken silouhette.bmp delete mode 100755 photos/2018/album1/chicken silouhette.bmp delete mode 100755 photos/2018/album1/chicken silouhette2.bmp delete mode 100644 photos/compress.py create mode 100644 photos/compress_photos.py diff --git a/assets/css/photos.css b/assets/css/photos.css index 734b0ad..e87ac87 100644 --- a/assets/css/photos.css +++ b/assets/css/photos.css @@ -29,7 +29,9 @@ .photos img { display: inline-flex; - width: 25%; + /* 4/3 format */ + width: 140px; + height: 105px; opacity: 1; cursor: pointer; transition: 0.3s; diff --git a/assets/scripts/photosScript.js b/assets/scripts/photosScript.js index 20f631c..0fc5f6d 100644 --- a/assets/scripts/photosScript.js +++ b/assets/scripts/photosScript.js @@ -18,6 +18,10 @@ function displayBig(elem) { photoOverlay.fadeIn(500); } +function getSourceFromThumbnail(source) { + return source.replace("photos_thumb/", "photos/"); +} + /* * Hide showcase image */ @@ -107,8 +111,8 @@ function displayNext(direction) { var currentSrc = showcase.attr('src'); var photos = document.getElementsByClassName("photo"); var current = 0; - for (i = 0; i < photos.length; i++) { - if ($(photos[i]).attr('src') == currentSrc) { + for (var i = 0; i < photos.length; i++) { + if (getSourceFromThumbnail($(photos[i]).attr('src')) === currentSrc) { current = i; } } @@ -129,8 +133,9 @@ function displayNext(direction) { /* * Change image source, link and download */ -function changeImage(src) { - showcase.attr("src", src); - showcaseLink.attr("href", src); - showcaseDownload.attr("href", src); +function changeImage(thumb) { + var source = getSourceFromThumbnail(thumb); + showcase.attr("src", source); + showcaseLink.attr("href", source); + showcaseDownload.attr("href", source); } diff --git a/photos.php b/photos.php index 5fabb5f..9c6e5a3 100644 --- a/photos.php +++ b/photos.php @@ -63,7 +63,7 @@ function getDirectories($dir) // Get all photos in the specified path function getPhotos($dir) { - $dir = "photos".$dir; + $dir = "photos_thumb".$dir; $files = scandir($dir); $displayedItems = 0; foreach ($files as $key => $value) { diff --git a/photos/2016/album1/chicken silouhette.bmp b/photos/2016/album1/chicken silouhette.bmp deleted file mode 100755 index 2592cd9ba95c9a852d70edd7c0a71940a36661b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1216298 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½_vKr>#H+V~Gw0pC{{Oi2 z_Urv>CW=&jupZ=4mbR_Bn52Bu1GHOtrwz@Bbcl8H>#Mw>R~T0S2}jSk}hge{Ws4 z>lkMszk%NMDDwOH&+lK3<(Prb2BOtzIs2S5F%qL{2BOueDC?=_z<$*}1{hcxh*FOq z>sYSM-@G!wz}!HjdKG0Y^Z5APd0~KoiUuOo=$IjK6E_C( z8R%J;dCKQWPUZ9t13l|jgm>Q&WAAX58DJoqfk*vauBlf|UarI6&I^0D9j0Sqt3J{e%3wShZpTa-J zQwCxgXjNzBHCA5bLp~TdZ=h9u?DZT5&KnRzF=QaNffn^uj$`Loe&mON^9EYf${x>< z`}4UMLos9^u7NXkRbJ!fRc_>lfwl(D)XLuXve4Foc#0^Sd1CC*TB2lxBO0S?#+#Oi#G#t3@qzmq`&7*Uaf2Xz2D=Q zk_)+DppAi7b#M8ZShtC_IEo_!;~H4j#YlfIUCr0F{LbIw8k9S^W8m4qywmY?~%u3x#A`%DJ5)ZI+`wHN1?0R~za*it)tUejWap5d%8 zz(8~ZpXzM%^;@4a#sCAo41B7eJ-_c26Yq5%8DQW}1MlkWo$K%}?ipZUL<8??Xz%Yv zjHflL0}L>*)xf(NyY(5ap(VcC_V_u~^5whP%3(_$<&lAB z1CLra)jhF!j*WPT2LlWoHL#o`@BDjO^ZcFDXMQrx00Rs#zyJdbF!0I1e2%>H_xZY} z_s&1_JG%@pzyJdbFu(u3^2d|0}OmJaOVs=z3bDOe9tWd z3^2d|0}L?0z!n43e7Wc6^xQr7%&(p9_mfcu7+`<_1{h#~fwKnYbLN)cU%hY3ebY6s z?)MqT3^2d|0}L?000T!1Of%+|pKH(Ga_@A_+B1C4F9QrPzyJdbFu*_y1Jm5O{JHk* z<#q4=UVDbm*=2wM1{h#~0R|XoWnejvzI*QS+IN4ydyen;Wq<(&7+`<_1{i2%U_O(6 zdglDvcfWsnj_>(pfB^;=V1NMz7-(T&K9hcW-u&8kzkhm;@7ZO50R|XgfB^;=Xl39r zmu`L5a)#Y{pX+#KfB^;=V1NMz80c-lEX!bTgWk^|0}L?000Ru1F)*KJ&pgMy95TQF z0}L?000Rv4Ffh%tJ>Kn|%rn3M0}L?000Ru1F<_SE=Zqis^1}cF3^2d|1HBDA=GoqB z@P6lj0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz H&KUS#w}cYO diff --git a/photos/2018/album1/chicken silouhette.bmp b/photos/2018/album1/chicken silouhette.bmp deleted file mode 100755 index 2592cd9ba95c9a852d70edd7c0a71940a36661b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1216298 zcmeI*J(BFoQUKrqOgz{CHp_Sp77km%Wd#_p1@?f$?hdCpAx5ofb?c|3%F6s+aARh= z^;4DkRc6Kuxcudx|M5Tn?(6ZNfB*f@zy1E_zyJE{>wo_0>+7$+{^9Fye*gVn|M7QU zfB&~%|M$=DKd1lv`uh6+|M~jMKmE(UPG4;O`TI4`|M~Un*O!09fB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|W-Yv9+{*VmbUzSt>iNA7>gz4Oli0}L?0 zKnDY7X4g;mns3ZE3^2d|0}L=Ql7abbGt#<8U+W|8TlX-}QLo>(uGMww9|H_9zyJdb zY%#EB7Mefridks>e7|q=yET7TfB^>b7^pG}Wi>m^i=Xy4U6<|Wr+xcAPpy(mxnzI=1{io{V47`SeK-GX zx^Cp3^ZjJ_eV&U?`#F?zE*`$iQ@`X=E*W5e0S2bo=97i#x@Uc08k z=kqxDJx|S&OSxo#0R|YD8+bL-%)fv9{_2`6pDp(~(%)Hf&}tte<<45wVFnmrfB^>D z7-%&|jP#r=cB02TOPuYaO|20}ab$o21{k=)K*V|IihX8$X2jf0YswgJds2fLV1NMz z7>H+JnmwZYWMrR_D0!Q&Lk{=lP`t#80R|XgfPv!%<}*m|-{o18CcFEJ^q%%<2me+ujM=C?|A;iPV5+9fB^;=IB#G%o80lYyq(Y66vI36 z_39nd`~7T}OR*G71{h#~0S1m4cr~kB@tOP_%g?*GU6H4E&wRHQ-?h)Ln2IR_3^2d| z1KSL|n_pUdClA~5a3oGG^7H8#N7m(@>vAr(V#@#n3^2gJPXnLknKR#u_s@8@h{>6p zY`wR|Iz8i>{EMr&GQa=>3^4F)VC#Id=Q=Tdj&X~4?1}%GYg??hX3^2ez4+BT$x*qF%yz|IfN4%$3e7#obkqjJ}^X}Z=k@bym z&z&*!E;We(1{h#~0R}P}I5P8H8HXe58RecUbx(4>njC-u?eRkyQ_w3uXbHxw=nT2c;nC+ry>Gccf5$N^7jnS>0}L?000R#LN9V|;pQF!-c;9kw z{&rRvV1NMz7+`>bSO(6_kjq@2c~+!*m;3T}EVJ?<9}F;_fLEEGoE8PkrM_OV1NMz>KQmYKR(Qy zea1-lJ0tbZh@8tg0}L?000S`%oS7k~oSu2ci1$wW_A{nwd65?e7+`<_2I?3%I!jJQ zj^01=ebe6ktaDD}TCN#jfB^;=h-cvFJo(7w(R(x8$8tQ&av~=TFu(u<4Ae4kbf$bb zIeKrF`<#_pXGOl{n*jzGV1R*G2C~eQz4pO#EYI>G9}F0J zfgCWv00Rs#klR3%xi8~7oSocfM}Fm(0R|XgfPuaSGR}{Y_QZEz-{LR+3^2d|0}SLg z5NYnqx)x_B_ZgC3`DK6s1{h$VkAbYSW3+wo-N(1Mi#r1hFu(u}^Qx@PnaXvh#DBL`O0y=b>kL$$5l7v-^KjjH5L>ZjfB^;=U|=i*qt0{I{q?mq2F~PIXHvf8 zivb20V1R*b2DZ*ZuG>C0jv6axX4{z&Cvjqc0R|XgAdZ1i=Pv8+H(NWuan7$?$OQuo zFu*`%1Lnbg^I(P8S3X(8|qi!lQXFu*_+1LnL~ zb6&N4R5@q%si!c&00Rs#(B43`xygRx&h5^3`|~ZPV#)vm3^0)0fY~nYY*#rq+0UK* z=`9Q}zyJdboHtN;R~BB&VkK4#Fu(uXBB%ggKse~(mAzOeT4xA7+`>b*9NxqeAk!_GaFDFUe^Y35f=s+V1R+> z1~Shl_GbRxYasf0wLU$C0R|XgfPrTNdwad>&4(2Xs1wh1LOjHS0R|XgAfkZ^Gl@N# zy^k7*cxJ6hFJXWI1{h%AkAb88-F;@mY6jE{eS-l87+`>bcm}G?Blc?sKVv`*i&w+s zL{1oBfPuOO&h&KmnhC2KP&4b+Ou3hP1{h!V+I&tAcg_6hxwC%YYeDyF>0JV$O8imFp$@P8RnW9MqI^pZa@vqTSMhm zZW&;Jfqn+&z1Ht$F9xnPpw{)Pbz(2}3^2ezJ_F{KYv&g672j6|)Y5#lR8HlT0R|Yj z-@vOL>oc<#1NRwF_wKKIVlL(kFu*__17?={W)`s)>oo&vYMz=ZmvYGf0}R}2V6C_M z+}y>$y$002duyL~i#G!dFfhIWv&y}*ig=6nCj;v0_;pnd<&Xge7`V^Cr@rcYvlj#R z8&Cu9tAS!I)(kMfz_gTbI|dkF;2r~8d#dZqUkvmypcdX! z3&mNS8DM~c@eG(v`phQcF7A5`sITMIS2>e21{h%AS_6A~sq4*O4D>aiCSF?;#aDb8 zV1R*f446s!&LrY5{zna{v*XlRxsode7+~N!14sL)`^;br^f#b3URN8%R%{tyfPwf1 z%p(0~5jl{9vj)`K__bD!RDURaE00RufGhp_JIeW;9ytFi+_QtEdav~=TFu*_?11fjkvRh+{n$<2GrpGHCPVhfB^;=IA-AL9_jh!Fb2jjpoSi+ zq2eZP3^2ez9|Pu#G3E<-lBc^2sKtG1vAByn0}L>*&%j-M(R<8b42)+$J>6GN#Y?;x zV1R-9445m%n=9l@&UzS7m+z~~VlCDTFu=ez13mhocbdZ(7}J2dx~;B?lQ=QJ00Y+> zFiVU%OURqN^){eBUtgcaSd1B9fPr-bz5Af|o5dIy-+&ssUSq{ZY#3mGfolwyAI6^_ zbwg$`&d1eQ>l*>p4 z)atgiT0F&*0R|ZOX&_SHvleq01NjW7yFcr$n1~4j3@~usfSDoR%pj+78r6WBeZFRk zp%^m200Z9!qV_xMGK(>g(}4Q>U4O+wEEr&bfpZ4T3OQ#5d6n1b2Gs6zwOjnej{yd% z8;IWLtj{dQKyCxoYq0&BLl|Iyf#U|u2)Snj`IX-h45;D9Yq;2n9RmzhHZVeuvqrNR z12qg(uEq9l7GZz^2KE^+8`PK$ zGeNDHK)&UBL<4I1=UOgCV#ELgRSk^T*R0t*#y~9tRqL~Tn@t#CfPwc0%mcON0r{5i zQ4Of&?`ygEhz|n{R5UPZPqS|G7y~s8RIJnXY(8Ot0R~{}cM>e3Izpm%v zA}$OtP|?81{mk0UV+_4v=?w&tO1J|5?+;L`)c9pptbZv*R-*U7*9Gmz6jh5lua<}?Nv zco@*fa`rKKl~)Gp8qnYMcLo@!WI(^G+wbIF?it8upi=*`SMwSJ3_J|zW%+uUoXRN! zbq(n4dOHIQR5GC7)$Mn3FZT@OGf=62*{gYt0R|oh^s;=tOityLftm*Nb$y)y1}YlR z^J?}yd6#zvav7-DzwFuE#sC8k1NvF6ekPyt$v`~=`ni7200Wf`=zI10o}9}$19=Qo z?qBw9eq(@vhXFk;PfwFexn!W80li!=XMlm~2K2sqy-&{NoPj(Bs`oJaH^(u+fS#78 zr^%&UGEmEa9T=#en{0hGBpK2L2exQrGRnjKTl|l?>=%<`@PTV8AR}sqfjVIgf!{ z2J|p<3V3yU}bM?JwR^Yx%Rd9(1}fEldo}AYz(5uQ`q+0L6AQ6mptgZ5b=^M9C=4)A z#elwDyKl?C{4?-upi1qxPje0f3}i8&k3IJ>@emINY8%K>+wH@g!Th_H0LnDKn4SP*mDmP5Ak4tfef|X9?U2VFi^#SzO8RFzyJf!2CCG5`!wq? zz(58Adf0Oh6A$rVfPoCP-5$&+3@}i^fS#>qGr#}?&ju>getR_IFu*_-1A5qV4-*gZ zV1R)v_1!+qDhx1C!GON4Z!^FE1J4F3)P8$3<1oNL76W?Na}N^_@nC>~EcM+!%qk2p zP{Dw{t#32H00YkkD%5^^G~+P9Ko$df*mDmP5Ak4tfh_giKFlf%Fi^pOzO8RFzyJf! z1}fBkdo<%Pz(5uQdf0Oh6A$rVptgZ5wcS3-|fS!!TK-Djdmcx>>-P*Wz(8yR5&DKTm>n57Z{Ss}71v{NeHBZe#qMSDBR>q(HK5lW>viHL zZjlUps^O8=I>K5$#nbn7d#2pWJp=I!jL=uC(cH+ux`91)RUFsjIFHSqn7TGzUy~C# zVW5_QdHweLwmv6L;&i8h);0OgwU7F))-m_IT76Z%<(q+f4UF1rtlK`d93>-J0Zt?#??x>kG1_M9tY?%But zmDq_L0}Q+}kgW&VkJ)^WfmdhZ%x9n8edgI$-TP_H)xN(f&Yr6WGr#}?*BGeQr|j3P ztCl?15@+K1Oz`pSLp;QT0R~1epqD-OGV#b4j}gvc&owgtZN6t7yxYvc00RshGoX)s z_c5`^6$>?Cdre^fk9}sgn-MFqVt|1t2K2C8^IP?NMmblbt)se|Y5$|;&3ere3^2gJ z{r~=ppM_}oupaXU0}L>*%|P}3W&g2fS?74$Ic^oF%IBd~ z3_a&wv*In@3@}i+ciDT)IaXcjSC=ZE3GVv26ML~|fPu3HD)%pYk1@}lHSGR&b+Gc8 z;HaG=u@p-N7`W3w<=$oQeP`J_oqN}|x?1^6FtW{vIEfPj3`8?fxp&$7{j+Q||JL(d zlPjMI7M?ALhj=i+zz7B^_bq$BZ;l<|ELh{8nqB=|aG-ZHzyJed8K~a3?EkuXRxKE- z7EJl7ekP_k_&KIud6PE=>KUlsx9q?DEUS);T}PaWuiuAa>>OIZ{4u~lB?J0a`&q7H zOe>w43VW?+c)8~adA3LM4g(BiFtDuO{x;igF_6K&J*?O8Ee0xF!^pZ3u@M^v7>Ht^ zLO-&{HuHHDv(|Ba{d8u&&kS$ZdlO?ZW`Kb+2K21&o+TDPV{yiod&jL!&cgFqV0m22 zawm5TI$7+|2a0ljLyS7nV& zYeSxwyDnut2QBu+es25nE58hkVW34l_l)@Su=6;^d5oAR=X?EpN6eQsIqM8CP|bio zwce*P#HN~O`)yytGn|7f_rP3xb7Cr{3^1_Az?C)Lv-`}+d-CsE^uzAkOU3=lid1QbA2JSI%S6%m>_OpO9a?cqN zXS3{?`o)iP$^ZilTx;M=jdpMQ`Se{(orP=9g7~h-_nk}MZL0%(t@{!iv0;FLGY0gb zZGGtOIGxFaqwKA+KYJge{*H2%Mp-BKW4M6|>u76Ui@ndCO9mKV;M>4xwY}$hx%qY@7Gm)*(DOW2dG{1&XU>^pfB^=68mQ6> z_U@CFpH{>~OkNq-d$wGE?%(_ODhEDuHW^@`vH^YNPhY8Qz~0rsvj)_WbMxt*_?^v_ z`<-_N7|3K`PyNh#ZKizMi~7{dK-T&YabLZ1?7iv>0}Mno5V20*v8IT*uqHKPbOU#s zUGMn%{a*k(D`LO^0}MP2RO|`tv(Lb_1}fH-JNL}*wSL7{d>I(Sz@2qB%DdPc!=^mt z$WxSapK%?|NRBfikMhXCaRV7^``Vs3IqpR4#O{oNwKM7S^Z)l@XY%4+=b8ZqG8xF+ zQ!?erUeujY4P>q{z4kV$1?yJF7+|2afnIg^%J;U8k>@#g44gM`<(aSeY$nf}6hkp& zAcui0J%Gm?9_2A_9<$V%2>WnO@}3j9m0Je(8HiAm½_vKr>#H+V~Gw0pC{{Oi2 z_Urv>CW=&jupZ=4mbR_Bn52Bu1GHOtrwz@Bbcl8H>#Mw>R~T0S2}jSk}hge{Ws4 z>lkMszk%NMDDwOH&+lK3<(Prb2BOtzIs2S5F%qL{2BOueDC?=_z<$*}1{hcxh*FOq z>sYSM-@G!wz}!HjdKG0Y^Z5APd0~KoiUuOo=$IjK6E_C( z8R%J;dCKQWPUZ9t13l|jgm>Q&WAAX58DJoqfk*vauBlf|UarI6&I^0D9j0Sqt3J{e%3wShZpTa-J zQwCxgXjNzBHCA5bLp~TdZ=h9u?DZT5&KnRzF=QaNffn^uj$`Loe&mON^9EYf${x>< z`}4UMLos9^u7NXkRbJ!fRc_>lfwl(D)XLuXve4Foc#0^Sd1CC*TB2lxBO0S?#+#Oi#G#t3@qzmq`&7*Uaf2Xz2D=Q zk_)+DppAi7b#M8ZShtC_IEo_!;~H4j#YlfIUCr0F{LbIw8k9S^W8m4qywmY?~%u3x#A`%DJ5)ZI+`wHN1?0R~za*it)tUejWap5d%8 zz(8~ZpXzM%^;@4a#sCAo41B7eJ-_c26Yq5%8DQW}1MlkWo$K%}?ipZUL<8??Xz%Yv zjHflL0}L>*)xf(NyY(5ap(VcC_V_u~^5whP%3(_$<&lAB z1CLra)jhF!j*WPT2LlWoHL#o`@BDjO^ZcFDXMQrx00Rs#zyJdbF!0I1e2%>H_xZY} z_s&1_JG%@pzyJdbFu(u3^2d|0}OmJaOVs=z3bDOe9tWd z3^2d|0}L?0z!n43e7Wc6^xQr7%&(p9_mfcu7+`<_1{h#~fwKnYbLN)cU%hY3ebY6s z?)MqT3^2d|0}L?000T!1Of%+|pKH(Ga_@A_+B1C4F9QrPzyJdbFu*_y1Jm5O{JHk* z<#q4=UVDbm*=2wM1{h#~0R|XoWnejvzI*QS+IN4ydyen;Wq<(&7+`<_1{i2%U_O(6 zdglDvcfWsnj_>(pfB^;=V1NMz7-(T&K9hcW-u&8kzkhm;@7ZO50R|XgfB^;=Xl39r zmu`L5a)#Y{pX+#KfB^;=V1NMz80c-lEX!bTgWk^|0}L?000Ru1F)*KJ&pgMy95TQF z0}L?000Rv4Ffh%tJ>Kn|%rn3M0}L?000Ru1F<_SE=Zqis^1}cF3^2d|1HBDA=GoqB z@P6lj0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz H&KUS#w}cYO diff --git a/photos/2018/album1/chicken silouhette2.bmp b/photos/2018/album1/chicken silouhette2.bmp deleted file mode 100755 index 2592cd9ba95c9a852d70edd7c0a71940a36661b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1216298 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½_vKr>#H+V~Gw0pC{{Oi2 z_Urv>CW=&jupZ=4mbR_Bn52Bu1GHOtrwz@Bbcl8H>#Mw>R~T0S2}jSk}hge{Ws4 z>lkMszk%NMDDwOH&+lK3<(Prb2BOtzIs2S5F%qL{2BOueDC?=_z<$*}1{hcxh*FOq z>sYSM-@G!wz}!HjdKG0Y^Z5APd0~KoiUuOo=$IjK6E_C( z8R%J;dCKQWPUZ9t13l|jgm>Q&WAAX58DJoqfk*vauBlf|UarI6&I^0D9j0Sqt3J{e%3wShZpTa-J zQwCxgXjNzBHCA5bLp~TdZ=h9u?DZT5&KnRzF=QaNffn^uj$`Loe&mON^9EYf${x>< z`}4UMLos9^u7NXkRbJ!fRc_>lfwl(D)XLuXve4Foc#0^Sd1CC*TB2lxBO0S?#+#Oi#G#t3@qzmq`&7*Uaf2Xz2D=Q zk_)+DppAi7b#M8ZShtC_IEo_!;~H4j#YlfIUCr0F{LbIw8k9S^W8m4qywmY?~%u3x#A`%DJ5)ZI+`wHN1?0R~za*it)tUejWap5d%8 zz(8~ZpXzM%^;@4a#sCAo41B7eJ-_c26Yq5%8DQW}1MlkWo$K%}?ipZUL<8??Xz%Yv zjHflL0}L>*)xf(NyY(5ap(VcC_V_u~^5whP%3(_$<&lAB z1CLra)jhF!j*WPT2LlWoHL#o`@BDjO^ZcFDXMQrx00Rs#zyJdbF!0I1e2%>H_xZY} z_s&1_JG%@pzyJdbFu(u3^2d|0}OmJaOVs=z3bDOe9tWd z3^2d|0}L?0z!n43e7Wc6^xQr7%&(p9_mfcu7+`<_1{h#~fwKnYbLN)cU%hY3ebY6s z?)MqT3^2d|0}L?000T!1Of%+|pKH(Ga_@A_+B1C4F9QrPzyJdbFu*_y1Jm5O{JHk* z<#q4=UVDbm*=2wM1{h#~0R|XoWnejvzI*QS+IN4ydyen;Wq<(&7+`<_1{i2%U_O(6 zdglDvcfWsnj_>(pfB^;=V1NMz7-(T&K9hcW-u&8kzkhm;@7ZO50R|XgfB^;=Xl39r zmu`L5a)#Y{pX+#KfB^;=V1NMz80c-lEX!bTgWk^|0}L?000Ru1F)*KJ&pgMy95TQF z0}L?000Rv4Ffh%tJ>Kn|%rn3M0}L?000Ru1F<_SE=Zqis^1}cF3^2d|1HBDA=GoqB z@P6lj0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz H&KUS#w}cYO diff --git a/photos/compress.py b/photos/compress.py deleted file mode 100644 index a6b7214..0000000 --- a/photos/compress.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/python - -import os -import sys -from zipfile import ZipFile, ZIP_DEFLATED - - -def zip_dir(path): - """ - Compress files in the specified directory and sub-directories - Create one zip per folder - - :param path: directory to get files in - :return: - """ - for root, dirs, files in os.walk(path): - if is_directory_valid(root, len(files)): - print("Compressing '" + root + "'", end="") - with ZipFile(os.path.join(root, get_current_dir(root)) + ".zip", "w", ZIP_DEFLATED) as zip_file: - for fn in files: - if not fn.endswith("zip"): - print(".", end="") - absolute_file_name = os.path.join(root, fn) - zippped_file_name = absolute_file_name[len(root)+len(os.sep):] # XXX: relative path - zip_file.write(absolute_file_name, zippped_file_name) - print("done") - print("COMPRESSION FINISHED") - - -def is_directory_valid(path, files_number): - """ - Check if the given path is not hidden or emptty - :param files_number: number of files in the folder - :param path: Path to check - :return: True if path contains a hidden folder or is empty, False otherwise - """ - directories = path.split(os.sep) - valid = files_number > 0 - for dn in directories: - if dn.startswith(".") or not valid: - valid = False - break - return valid - - -def get_current_dir(path): - """ - Get the name of the current directory - :param path: Path to search the name in - :return: directory name - """ - return os.path.basename(os.path.normpath(path)) - - -def get_confirmation(path): - """ - Tell the user which folders will be compressed, and asks for confirmation - :param path: Root path for search - :return: True if user confirmed, False otherwise - """ - print("The following folders will be compressed (hidden and empty folders are ignored):") - for root, dirs, files in os.walk(path): - if is_directory_valid(root, len(files)): - print(root) - confirmation = input("Are you sure you want to proceed? [Y/n]") - return confirmation == "Y" or confirmation == "y" - - -if __name__ == '__main__': - # Get path from arguments or use the script's path - if len(sys.argv) > 1: - directory = sys.argv[1] - else: - directory = os.path.dirname(os.path.realpath(__file__)) - if get_confirmation(directory): - zip_dir(directory) - else: - print("Compression aborted") diff --git a/photos/compress_photos.py b/photos/compress_photos.py new file mode 100644 index 0000000..ed34638 --- /dev/null +++ b/photos/compress_photos.py @@ -0,0 +1,145 @@ +#!/usr/bin/python + +import os +import sys +from zipfile import ZipFile, ZIP_DEFLATED +from PIL import Image + + +def get_images(path): + """ + get images in the folder specified and all its sub folders (hidden and empty folders are ignored) + + :param path: directory to get images in + :return: images list + """ + file_list = [] + for root, dirs, files in os.walk(path): + if is_directory_valid(root, len(files)): + for fn in files: + if fn.endswith("png") or fn.endswith("jpg") or fn.endswith("bmp"): + file_list.append(os.path.join(root, fn)) + return file_list + + +def compress_images(images): + """ + Compress images to a 140x105 format, cropping in the middle if needed + :param images: list o images paths to compress + :return: + """ + size = 140, 105 # 4/3 format + print("Creating thumbnails", end="") + for current_img in images: + print(".", end="") + # If height is higher we resize vertically, if not we resize horizontally + img = Image.open(current_img) + # Get current and desired ratio for the images + img_ratio = img.size[0] / float(img.size[1]) + ratio = size[0] / float(size[1]) + # The image is scaled/cropped vertically or horizontally depending on the ratio + if ratio > img_ratio: + img = img.resize((size[0], round(size[0] * img.size[1] / img.size[0])), Image.BILINEAR) + # Crop in the middle + box = (0, round((img.size[1] - size[1]) / 2), img.size[0], round((img.size[1] + size[1]) / 2)) + img = img.crop(box) + elif ratio < img_ratio: + img = img.resize((round(size[1] * img.size[0] / img.size[1]), size[1]), Image.BILINEAR) + # Crop in the middle + box = (round((img.size[0] - size[0]) / 2), 0, round((img.size[0] + size[0]) / 2), img.size[1]) + img = img.crop(box) + else: + img = img.resize((size[0], size[1]), Image.BILINEAR) + # If the scale is the same, we do not need to crop + filename = get_new_path(current_img) + if not os.path.exists(os.path.dirname(filename)): + try: + os.makedirs(os.path.dirname(filename)) + except OSError: + sys.exit("Fatal : Directory '" + os.path.dirname(filename) + "' does not exist and cannot be created") + + img.save(filename, "JPEG") + print("Done. Thumbnails saved in 'photos_thumb' directory") + + +def get_new_path(img): + """ + Replace the original path to the thumbnail one (replace 'photos' by 'photos_thumb') + :param img: original path + :return: modified path + """ + return img.replace("/photos/", "/photos_thumb/", 1) + + +def zip_dir(path): + """ + Compress files in the specified directory and sub-directories + Create one zip per folder + + :param path: directory to get files in + :return: + """ + for root, dirs, files in os.walk(path): + if is_directory_valid(root, len(files)): + print("Compressing '" + root + "'", end="") + with ZipFile(os.path.join(root, get_current_dir(root)) + ".zip", "w", ZIP_DEFLATED) as zip_file: + for fn in files: + if not fn.endswith("zip"): + print(".", end="") + absolute_file_name = os.path.join(root, fn) + zippped_file_name = absolute_file_name[len(root)+len(os.sep):] # XXX: relative path + zip_file.write(absolute_file_name, zippped_file_name) + print("done") + print("COMPRESSION FINISHED") + + +def is_directory_valid(path, files_number): + """ + Check if the given path is not hidden or empty + :param files_number: number of files in the folder + :param path: Path to check + :return: True if path contains a hidden folder or is empty, False otherwise + """ + directories = path.split(os.sep) + valid = files_number > 0 + for dn in directories: + if dn.startswith(".") or not valid: + valid = False + break + return valid + + +def get_current_dir(path): + """ + Get the name of the current directory + :param path: Path to search the name in + :return: directory name + """ + return os.path.basename(os.path.normpath(path)) + + +def get_confirmation(path): + """ + Tell the user which folders will be compressed, and asks for confirmation + :param path: Root path for search + :return: True if user confirmed, False otherwise + """ + print("The following folders will be compressed (hidden and empty folders are ignored):") + for root, dirs, files in os.walk(path): + if is_directory_valid(root, len(files)): + print(root) + confirmation = input("Are you sure you want to proceed? [Y/n]") + return confirmation == "Y" or confirmation == "y" + + +if __name__ == '__main__': + # Get path from arguments or use the script's path + if len(sys.argv) > 1: + directory = sys.argv[1] + else: + directory = os.path.dirname(os.path.realpath(__file__)) + if get_confirmation(directory): + zip_dir(directory) + compress_images(get_images(directory)) + else: + print("Compression aborted")