From f9502d3fbcbe3ddbafc2b91bee3fc2f50a8f7576 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Mon, 14 Sep 2020 10:01:33 +0200 Subject: [PATCH 1/9] feature (collage): choose between 2x2 & 2x4 pictures on collage Implementation by alzo425: https://github.com/alzo425/photobooth/commit/90099f17faa16ac4b4b3dd28a0ef7403dc2e29d6 Adjustments: - Only use collage related changes. - Fixed spaces. - Adjusted config. - Fixed Windows compatibility. Change-Id: Ie371872e774a9cccf4da2cf507d929f1e55db177 --- api/applyEffects.php | 3 +- config/config.inc.php | 2 + lib/collage.php | 84 ++++++++++++------ lib/configsetup.inc.php | 16 ++++ .../img/frames/DefaultCollageBackground.png | Bin 0 -> 70953 bytes resources/lang/en.json | 4 + 6 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 resources/img/frames/DefaultCollageBackground.png diff --git a/api/applyEffects.php b/api/applyEffects.php index 09d9ae86f..7f6d0ba6e 100644 --- a/api/applyEffects.php +++ b/api/applyEffects.php @@ -22,6 +22,7 @@ $filename_thumb = $config['foldersAbs']['thumbs'] . DIRECTORY_SEPARATOR . $file; $frame_path = __DIR__ . DIRECTORY_SEPARATOR .$config['take_frame_path']; $collage_frame_path = __DIR__ . DIRECTORY_SEPARATOR .$config['take_collage_frame_path']; +$collage_background = __DIR__ . DIRECTORY_SEPARATOR .$config['collage_background']; $picture_permissions = $config['picture_permissions']; if (isset($_POST['isCollage']) && $_POST['isCollage'] === 'true') { @@ -32,7 +33,7 @@ $collageSrcImagePaths[] = $collageBasename . '-' . $i . '.jpg'; } - if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $collage_frame_path)) { + if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $collage_frame_path, $config['collage_layout'], $collage_background)) { die(json_encode([ 'error' => 'Could not create collage' ])); diff --git a/config/config.inc.php b/config/config.inc.php index b1e6da292..9281525a4 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -44,6 +44,8 @@ $config['take_frame_path'] = '../resources/img/frames/frame.png'; $config['take_collage_frame'] = false; $config['take_collage_frame_path'] = '../resources/img/frames/frame.png'; +$config['collage_layout'] = '2x2'; // possible values are '2x2' or '2x4' +$config['collage_background'] = '../resources/img/frames/DefaultCollageBackground.png'; $config['chroma_keying'] = false; $config['use_collage'] = true; $config['continuous_collage'] = true; diff --git a/lib/collage.php b/lib/collage.php index 50cd6de3b..82ff40087 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -1,41 +1,73 @@ 'take_collage_frame_path', 'value' => htmlentities($config['take_collage_frame_path']) ], + 'collage_layout' => [ + 'type' => 'select', + 'name' => 'collage_layout', + 'placeholder' => $defaultConfig['collage_layout'], + 'options' => [ + '2x2' => '2x2', + '2x4' => '2x4' + ], + 'value' => $config['collage_layout'] + ], + 'collage_background' => [ + 'type' => 'input', + 'name' => 'collage_background', + 'placeholder' => $defaultConfig['collage_background'], + 'value' => $config['collage_background'] + ], 'collage_cntdwn_time' => [ 'type' => 'range', 'name' => 'collage_cntdwn_time', diff --git a/resources/img/frames/DefaultCollageBackground.png b/resources/img/frames/DefaultCollageBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..c042712937effdff175dc6c0bebc820d0de01423 GIT binary patch literal 70953 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�>fbTaL;7ug|;t^nJV)_vz}g#5kLwuyxb z{d#N;FAweXwtJ<6)fBd^R`>2EGiJ;XNmY>;Vkr>kGf-m0T)^!YX!LH~yWebMHltQe zp1X8}Qt}8){sLa)Ss&Y_aC-dudFZB4;Kottavq@0{VB5e9~|FHTD5fuC(DRg)oR+b z(T)ulsfdY_r(re`0$A(`&T+DJ=+=`4F_0_ohw#^#(97!JTd>3**}MDnY}kE0rI(lKg&93?gj@+8OY`_76$9 zbH@w`9jQad!JTK?s@HTcw#(cHX;zju08f~4MuztNe${U{y2ROa+_zq?N)h*(5+RTm z7)shfYZ`+`aMFkof8k4K7dg6y^Ohk1c3!-A5nMmv;Mlg}S>rRGFdOure#vWCO3~ee zo5`Ltk5{#cq>XSpE~1Ue%mufE|2l21;io(snoXwJoPq;$)y#h?=k)Z+5FW`GZI|Sy z?&pzgxzlpMfB^xB#jFtv<29%LN9ys4AE>AIiVn(d%iM9|Qx!YWEWTP|vqLV>g|nRl zb~L`+xaQSfs#QR#HGv0@-%$vz6{QQbyLOA=BZpXc@yV6g>?}sr8m;oE8y*9R6o`{= zStXb=I;ZuDG9gmplNV(~-JwL%s#)AmR+b@GCR~i*%mo>G%>U5)KmYvGJAebZ z?}8tXZTVicY;HFX%ijtbj=imdFzuBUWiN>zzJJm^ZG)nnR5wpMsYZ&omt1jTP9(Pu zOG7Yy&nOW*y9qq9a75-VP}R=KSN`XU@^W(}Ni{zoNKU5@Z*p(5eC*SiVdvk!cc|ZW zrHU!tYuOB{qy-R3TMMYvPSOWoN4rb6^I`_+w+rt7-&bR*gWI|QKik}`1q1_;Cg^WC z?ssGsnx}25KdWTT_Dkk9kKf?Dj6($@SsR9Pc~Jqdz@HO^U{JdT0(BJUgkRFBEGEPtPzK2 zSL7<}T^l5cfm+dA5Wm5fm_XZrBl5u{BeHbV(UXA6he$TBB7tng>)z z5u$$%a>hI@k_nBy>9@l^LSYGw&T0!6Li~Rg4xouALP`WGs$6~uk^f^gA#H;boVpgtPDVJ3G zeEYZ~=od#AFnH2cRBiqtpLWGG`V8Pk$L~oOb3TPh2PgpZH*4Q~wNlmOO0S{1Sma2f z2N-%_9`yA2^Dr)7-1J!gE`S=I7Z!%o*D5+W)WQV(3usc-xzYGSSxCDGlM{0zr@PlI zGPU@DwEKuQL9k2L^ERWZ6$`j5y8=zk{r_XCY!06&fD-x+PlX1EK)zDlxnT>HiyQ__ zng{BV&LOb?77TQLi-m}9ZRhg5(bSPEch{^|wH9)u;XGawHPRL;kmEUrs1E^m;_Y43 zwstd>EMO|L!5849cy!S@f&n#k_s+6gwk#Eu4Yjhz(4j;3&hmPp^4)%dxq!H-;KY8* z-%f`pnDQbE22>L@Sj>;S(TRnt|EQ_L)O<}rpl4l>t@{VMEvXZJFU_G&o&i1Dn%$i z%!^~Xjtjg;ynzKjN`$&`|Ncat_;~&&GlQh05{uFgKWw>tX+x8w?Yyso=ygp6E6QKN z{-=kTaG5QmIX8Mx68VIAHkSeCv0+={I#(Ys54+ny~Y`?p}vlO!M`sUAv!o zQ&Y2_tJZlL8(4Wqbuj;BjJLrkgAPqPtu*a)Z_BltCARHP)t|q8R+rKW-3FT-3kxoI zr0FgxTa(w@SuOZG`fej-P;%i%+M&9#xuELQ4Y~zCSGlq8jxtmF3#XHfYtSHHdlgQ= zL*yL#OL}_EGWgo4PTN>r1t=pC1J8}mIic=~NXa(pCVx;R9pTguhK)K(gK+)>>7x=S zHT;2={5h4Prjrp=!(CLii3D1Qh2+PHSfdmX}p3lOTbV5nm zp*4O4(~L|p8RGnLq~f(oS&V$l>j9hvI8g6TQ!qd9PPv_jcy({lX-c6-uiYknT5YOb z<42u^TXPCMVz*^V9xX=@BT~L&c)(T`c+}OT%XUoF$4FOUQ~S2sB+?*enOj!3zJF_T z=gu99)ln5Udwz9_Y7Uc;Ox-sOGQ!=JhTe*H?jFOK4Fal#Ptm)#Z*OCv>-)L3waB$) zZ;sMXp0`}bOL^oYH)=Y3a(5}qCdUi~=+bZ!OWpvjy=s%~eC|@x%QROWcPh%Q{op1B zDiV^WhD3ZKbM6N#@ih~>s9A@>R;Ju}$j9gNpu2I_%Y`#201HVRy2-UV*w=(<^+r^@ zE_!hUCLEV07?4x$oJY&h#Met=%zwaSvx=LaCG~#)oo_+2{ zPVDf@Nt4dO@r0$Z<%2tSHbm|*HZi$*XRun!n&ck5j%n^b49?h_zuV>WI;9uj6KvOE z3@Xy#P!I18!?OBh?Ao%W1Myc361o>WF_X38Oxp{2V1Yd}L;KA6=6Z{og5Pj8tf-rt zTc2s=@8A1&YWd^$A}ERnPXu>;W(MS!?YT7vZdGSw?ZC^^Z^OCl7wh=c3XNfR`kbb+v-*Bu;W+d~Jhdq7z^c9!)*Ia9k4HqlDMYauQ=35MW$t=MeE`3g?CU>_; z`F4v631N7hj%ewenjLi(Weg(bfa{k_wHnT&xNgOf4j1}wh!3G^!?FC}6%PIPW^i72 z^|MK;^hYl!ZKIZ7lXy&5Gh@P<-mRA51o2l)TuidNgyO|6 zt)DW^f8ahk2`mGCiL_AzXRqzE_m)Mubdk2s@>#3sgDV`8IWsQ&@*g1`Md~+HmA=($3HQSJ6#CoUnV5C-1;01&ZzQ4DT~0}DSFH@No)w!*KTZW6*MxA#3s#{@~b48^LrZ6 zH^KWsq!*z|pfCRxA; zOpDEQfoYU}hwQ>y-XZwxT$V2nbI(;y08>-*RTIgHFBgqT0=rXON?O{kXAQ2`u0h|% zTeuFeya@!+j#aDN7koQ%Ct87XYQtlztuovSs)Lc}9#C^uVEGl2U zcI{C-^?EMFvxao~cFQD{tZzo04yomOwgRF~WGo3a?ajZrUccsrdu#H7YuBkW^~?aO z8fo(3WxnyRXQ0v{ZMs^_mP}``c!QnM9I_bUtiy(Q+q_w7%alW(G3#jDOiVQ5NuOE~ z7jJt9gajqu0l56QcT2B~8h2Fix&nGQWJ+F}0BX-o(kIFtJk)CXuRqn|1FXvIey!{s za_Jj0hXoZ)9?HAoyINa*QMt`pY_&9!m3H&y|4)189+&go|M4q_p*d{C*fi&a97`L8 z#zLW`qsU>CLYYI+C=(lojijNY%T2^ZMnYK*o9IBPB#p#qsZ^tq67J`_;d{C7`>)^M zzsKYL<9cdl3@h%?T0oq2)3?&gD?u<-TUVjhV!(lk-LO^$l~|opt*nVUJnj- zql|)tr4!Jl9;A7aJPu)uH*DD85*ZI4A*WfZE+buuf3`U}l9oGsWefH9L&hJw^?cTl zkR|n(j9#lJEbe+g`qOd*kjs#ei8ba&m;uD~FTPDQE>0Q!rY9U1$297u1Jo$6o}jjE z+xpP-Kj)$FU&0{uj7QAGa4|h`#n9Y>W`;2=qQbj(w?27&g%xl7D-oayf#C07KO!SB zF;OI(^T@daD|9^LRt$`R=5yyjUmeSo=Y{&Ob7hz;f0zJSkIteRXj1HDT)MQiYFAJ> zX$FBBP3Z_hN+>Oc;u4|Xcckiui;Y!YKv5a|E-Jy-nNqp<~QA) zHB(JX6!px^7s14KMEKHf078pyUdHz;u?+PBiU)zLU-4+1^uDr0EN?({ALkMvzew2M zg~I#NtM#=K2p4D`SNNigGnBkOs2v$_vM@e~V3=;^ASxi!6ep^(fE}z9(~xGtO|(|* zm(-NhziU}G?K^gi#)cx%!Q$CQ&Hba#GpSyDBSR)kve~X8C^$?%G9NjH;NC3JCE>-y zO<$E}0;>Zj@!(5EtAj3gO<7X&-G3evUB}S|!L-LvXyzpB$KzSYx5?Qz=_5JtXjdkk z+|Nm=+p3i#_;khcj|uDG@jVcs1e#~Dp~1>i>-#L&qS0s=Sgs{3^{g(>pGF(Il~%m$ zOi$Y%k>{rU{(FxyW3A_ROKeN*OS7~Q_=!S?%-JYo#>v|&Ccu$QIC%*X4{tWEWMKg> zcLH`-2aW~@fHPN*X4VPMv=t3>M38}AFKwpN-D1g)h8r)Dlnn$aS!H?91=8S4)8^*^ z&nVc&MzeDlwKm(II37*>o_J}VtXsSG06?Mmj;IgWhr5jQpF%j%bq-rE{dNKEzgb}L z`iM;mpvE(yRB>tPl$FASAXcEIExrzA6F2L8BR1o$?Spl0t=9qwS~8Kq9NY5heyN*C zU%oCWq9+ufkXd3*3TlK|$C|_HXtC>C4f&8P&cn5y+8y6E9vF2^Vubc#;bwv!P0DOUH}%2pRtFt?=CZ6 z8*v#j*Pv48B5|vz?*(=g#_AGW;_n7|}1TG_$si^fwEy*csgI(KU%9I-;Jn5CM!AphS z4HpxWd|42~LCJFDHEs4#Jsqg^kvk%K?bLFePsSFkPLh^` z*cC^N{~wizpiAkYCY~Ji3Sa=i7H@!nelz_at;M+J9bQbu7gax)#$KvK;ZyT~m)d9G za$eF9qkBD5zB>AVnRqMCI*PGSx>i}Tapaz|{1?2qr4_fQGfdDL@REn$^M3o6-^V`1KI((#J#FQsEnS@1 zC=!HjX=ynRs;rKX-jJ^gfaM89(h%_%HNv=K%aVe#XNA@m!65BF4(#xpPL%0>v3Xw4 zcQjJaT8qgfF^RzDl}*s4{5j6TUU1d~*IARydTa*CtUi7s-V^+ZTpas^IG$iJtfeg= z3E^h;kfg(J`lINx18FcpCNzFs zN0#)blvACq6OE1rC9v#U9&~=Z_qYz5di`F_DxFH_aJJ|J=z)xCJ z$8T_{B3EMrEg$gcMSbNL0-Q+}2AMyiv;2LpHnwTe0>@#n)1Q(Iv%K#k5JDN9SrDG| zG(s(XX{WxgwTr*^hCsl-F1zwM)oMN?TZ{)ItP3ECgV5?2UDvK%n>VPBZM`x^s;q*r znh0|I%P)h7c^QYD0vG?~9HZF0LlTfe)``e18N3#RcQA}pjtYz6Li*!-78x%Z#RFgr z@sR?2ai_;P_t?C3Emr^e`f^y7pIho&6Onyw+^`{&X+w6jW*Cx=tN5C{?)g|e(!zC* z72*q7Re!IG05BY|`$YfBM0q*$N4gBNsKy&#-_gb|4(!1`%#vslX-yb_KODAXuWaW+ zNpZkEZ?vmzBg-A11r?Sz+m_OEPv(?GZ(?LDP6&cQwJu?elcK!-8cH2#oBj*(nXbTR zvBd5ccm2Q+4ojIVxjw@Zr(mYE>StfRm=;8v;3D3Sfr(XiXWVo)2E875l`s)?^N_)_ z*WLE37(qOcSy>3|5XYSXNlP+-!RuI0^8;{{*ci&=z=BwVo;@G1D&SeRhet$IKL1v2 zsP(FU;AYs9dTrYVX=2fJOSdPA%#Ze`PC-$K4l0UL4HG#-$m$(_tN*1q8Uwn|C1FB5 zQbrvnJPC`vir{`yq`3=SPweDlRjs>>Y(UUi$f)q>%_MSb+39wM2g?UmbkmY3xAQRW93e~V!o=LzXRWnCm@2_G@{P&L zkcS|%8_jPHtEh86uAM`y0}02HkQhY4dnBEP;_M_oP)TVx=0DV(2j?B!!f->&psX40 zocp4L04^SCp!cxi&J=9Om1yRg`1D44<6iRv4;=zrURU{m_ADI( zhPa6{J@WWdlAAc{NM_5HEyevPsR5$wlon=lg$>_^iWSEe_KVyB-+=_%DWjPAJV}36 zQ$@;a(X9xUmRZ&#;cL?{bU4%=1+#nwu!g;4`Zooyx-sOh5u{n~k?<^0spOZdHh!ek>y0W7Y;xN^`8|%t z1_a1>TqQM9T$Qe<*{))u>kZ*E?ZU)tAR*9)@vsmlie1&Glux4P$+&wRo2PWD5}pB% znf`d;h4$`<@REHPv6ed}j;#E4?4HSpmh8woz=JseD9ES=sRlt*W0&~)I@7LZM><0R zQ9m=88YEjxstQNJ<;5SX_Zq(%qTgOirYBHXNTyqjxhGdgKmau)aRt~F&Hx30QQUra zD#Hu}!~hVT0lAeux_7VQLU9p(c8USxoXSal4aqg7wQp>m(Wa#CtPj_M7Qt?>SCAIN zlr)vuF2SQ&>&{naZyB*qUP&<%E7ZSjuPnpl>J?bR)Lmt2j9V9Q&P~~Gr#TQ_alG) zc3-LdN}hM{&Ye5=`w6*^&yiyLJTiCo?P@r;gJ9_^@HW%d9yZT!dPmDBnlzO_Hr8dx z#N2_dr$qg=v^dL>?l9w$TYM3jI!x$8v#WVv2N7E&puUJKUrcAqBNC;z;B&u^z^wbT zpt4|)g~bC@FBMmk;dSWF=sS1rc-3G$apZi=mFZZRwlT+km3ohpCA1j!?Iv-tg40pJ@Ay`>)V2YOjcCQ6{I=CSEpB}H@i}O zgX9wFu7|9wzV{q|q_{U=JIAvimR;HYffPix$04eNM?w)hUk+Aj6@>n)O&6DrWFCmd zrbcr)7twB3!(r4Bf&3P(}etU*(j{>7z94GJBm`kBB<%WQUZ-E8sPt)OYp1Lx>y}hSfpwWK zoH-N^4VQpK?%5p2bkhI$ku15(K%Dl1P^7H{n3o3n8qk9Pkze?doH!k2ZQyrfE;{}$ zdy*r`JYOgHbFHtkpP(HHL!=Ep{G$DB(3OVgg<;oVTS|Hh?-<@FK94;J>9?2N7IvF= zBDPM5>F`pso9Hhg3Or72=V;+JIU5G}_{cVI{Rzp9gpT2^)#jbR?33Rc>F7A zFU+9ZZ$7X%`T<&;Hf^>X&v>&4RBq?IOew!}RuJOv1FWgZh(CSW6F5MMP~jchZ)ODS zxLL8y8H5@cQ1Z!V0ss2z#p9U2>(9Q)rds<04L3Pt?MWDrx{C1CDPq%4Kgmcf21r5p zmf6fpJY7&E1{vN30a)P!Yeu4AuU*o{)>WA)0@sRi60=w~#(c4yXfjyNUr5VdQ?nz* z?bz(!!ViF_id-Fdt&gGMc*f+o(v@I)M@#+Hr<4KfoOmd6c{UO`OxbW*dhx5HbA{M= z@`ON*MZ4>6E~F%85(?u(8jAEwv`2BZ`eMdlD)Fd{w^*$B%>sT#pG*%XF$!pYG;9s0 zhzSG`Fzh!35OD1W9;rBQyHap%$2e1;|7vRA~oO-8HPzO+PkzwG}Vo17UB|I)W-&(DP|iU`WP zNEMJV{5jSGhB7-ZuR}3262%TqM-ok$mzvGvj6$nLmR^*)M`KH^Or>SV78Z;YtO$*_ z)2_jQ5{P>xI8J7r&BZFcu{Aq<>#w}J6%#+S;5Q;k1|sZ7q@N}o6^FL^6CcYfA z{Y`9lDwT28Y!n&xv?A!(_Mp(4y7VGT_@5VhT~M6zTf^i>I%@q$GkP&%2_y`)edo?b zL|kanQTNX!C};jv^=ibnvi8k-H?`fVEXG;m=sT`c!iApV6iF`erjwKrn)xZ3=Tt%^ zSvIkS`WI!C>DmRD#zGDMNWsFlxVs}fr&4P9UGee8HnyJRiGbrD?Ni!lt8 z`SRvII`=a=BCpwskg9kk~jiiK93Q5*+kv0XSM#&IVzx#1ZYz34xg}yyKv-TBQDI|;x zkPzo7HdZ<}-hFe5tJY5BZAwE8^4*W0L(4r3bdX34HYx3mkPV1rX7Ast^7=_@j4I*I zDLHZlR~O)?b?afzGU`zA$ycN)>BmeZ`8v!z%dFo$rQoA6J&0cEmIY*--Da_{G{d{8$tiudRW`XZ7ZX_-Ad ziaKYUBCJ=KBFIenS^Zc5o4Tx|NnLD*lp9(@t4R(f=_1f9iVypt2 z^!kHdkI3KZ&JhPlrj>J%ph;m>`OLu)S%p`y%pGRMNg5pvg)7;ISf`%YLUmiVbYR65 z@(K3@t6nGy6!it*_Yhnkp_*8hf<6Bzhad||#Uvi@$;Ao35_6u(L})_pwe&j~mACTq z(HajDgq3M6_OsC{UuFMW|4O={q{W+tpoDKFQRPxYm?5A==7e32`0ieQ@PeRVrKc4WMxCGOXT5`}IaK}=XNSdHkZnzoPW+|Jkt7IYZeR8Q&Wy{t> zzJr41;J=XH4HdYJp)0>UcC4LULo&9wco-9qOyzY+UB|y>Wgs9Fxff!9ly|IF2Pv+S zfR`1Z41$!fYAVap>5_SXPBr!RwsRzSunK~&Si+`&Tqe11r|n=y&whpe-Q;tIE6?-q zQMi&MH3}1n`rHs40Aqw30I9-{=*Mb_1^}pC_L8kG@*-huL=8d*RB4_~Za-v29f%%k z?Rnn?TRc+yLg!YJdV4_jE}h%J2Zjx(xioTH%pdNg+XLA{EMZ-iSZl3uS$pMx331pjRsBdeoyu84M44i+Wz5Gx3kxyJ$QE`Oc z6^;K&)8+YYUw=Amm_+T-sL^;#mdvUbiGUus^g{*RE3I{pb&-fvcs;q-rkGwRKGYa> zwAipSGY99o1pKK5eMv}lF&D|Mht>-!yA4hzmolMM{FN3_p1WlJQO_KhXGiXh+bo{$ zZ|>*_IDL>nMo7E+7(IXqMQutB_Jn>p)Ox6aVETEoM1c0Dff-AT>emHl4pVrM!F$H1 z4*n;_{l;UBj-^%%q0=evqK1l&2s7Es)FVC@=eW3K8*=fC5M@fF6x~MFi@2 zJA4Ap3(?yDK}U<-T2x1C&KE1*qRjEf@^1nwiu8&la(wmz1f9UL%PYxlS|P#C}u#f*(EvWIO>{W3yh$dhv;Y zfq`?S?jDByXvW2+`i%{>GDz;9M=Bu2N-EdQL=cBehL9L`;~)3SX&w5So4YdA%cd-^ z?R|Rm(Lo2m|F|vX$ePVMdb&#Qet$AyfpP}`z@*@UX^Ap-BBV2!bxw8K9RaRu!svk{ z<74}hGz@`A$2?vQ#>iwakid^Mn;U8Wz8lF53KS4^bab>=4cMtGS&ouFUfC@#5zRt- zlz?D~B}faX(lBW7!Wn1wk7OG>GFf-kYr3&#vmt<8I07%@i2 z{Y~3_gUfxx#AFDdl`?CPTf8s09MFCUS{(I-3m5#Yn``6M=f<*kjzduk*ez)2l7+9h z8;DggDb@zRXYr*%76$wzxdNzP;SwEA_M3GYNnY5$ptg2Y` z(hRo1aH6ukelZ58mWdm#BJku%-xJTczJ(@##R2(5Y=iaRt8}#_Adjs$SHx?}hnU2a zo>$JlOQcLnwjFi4Xv}C;Q>{MCpYiSxuAH)hvoj(8)0eGcCY87}ACY@`E{D+%Cq;E8(GT)KF%FXE3^;(^EAx&^G!+SNLX7cCMAd-v|$B`O3e*(-yw zdM1suTnK~Krq+Lai>_J;a<=EB_DQFNZp|Ks;#mGd)39pJ4-JiP=%6px@B~8J&@wku z-i7W4QJ={?&Xh>8++OyAuo~e;Xu0L~2jKR~ZoS@Wdf!`&0~gI4URcxtb8|E%2!#H{ zxFvCwXf?Oyd8M!4t9qzaTSm)VB~bCVB0j)zbr6OtJX50Wh+2^(fexFJ();M#(5kj; zr-&N{Q=0%PWA|hpG{!X}Lo#9;vR1z?2vB)#RC?p?YI(Om{BV`_*x`)-a!oozA*UWfsD`qp_iFo&V8u$ml|`enK*fE zc8xsDqWpQl^gl{s4YpaKjTL7WxW&@@$?uyPG!1O8y!ee8{wWC;@og+rUlt_9ZEuYZAFos9%?cSF1 zKHR`%49Q#qsj(9>7#A>Pdt`Vj9yAY80q!WyAMB_Io%ORBqBord|SU zZ@*VbofOv`!?XC98ZJ#?mCrE^D+}yk7_arSpUD_6;!r?Ikx9n5yE3W*g*wr1H;kSQ zcJ0d-=_6DACsx&UrnDFUF*&FRLyKH!nkDhB3NJtjU+36o!_`kW{Wq_!=8yIRa*+FW zP5Zoh6fT872?{7EpmMM6G&$R&upDLo#|r`%(3O zf7i;sQIb|(eDZc?aryf~)bhE&ChR!7y@#fOQ31Z0+BDZ|qxE^lQEi7Z>qrU(a{&A` zO_BX(_s|^Q&)lG&tz)VE*<)!y=V65& zzM?8xPC)s<6t|FaiOylDsvO+S*5rSCfb{wa%_Mj_NLwl2LNaYd;QtC;XsX}FaM5cj zW}https://keycode.info to find out the key id.", + "manual_general_collage_layout": "Choose between 2x2 and 2x4 pictures collage layout.", "manual_general_db_file": "Name of the database file.", "manual_general_default_imagefilter": "Choose an image filter which is applied by default after taking a picture.", "manual_general_disabled_filters": "Choose filters which get removed from the available image filters.", From 960eb9477028a4be61d87369f9c6790521f14ba1 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Mon, 14 Sep 2020 20:14:38 +0200 Subject: [PATCH 2/9] lib (collage): adjust given parameter --- lib/collage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/collage.php b/lib/collage.php index 82ff40087..a544978ef 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -1,6 +1,6 @@ Date: Fri, 18 Sep 2020 13:00:29 +0200 Subject: [PATCH 3/9] Added a third collage layout Change-Id: I666532f8d9ddbe69356d3935b3bbe4d86ab6ef7b --- lib/collage.php | 51 +++++++++++++++++++++++++++++++++++++++++ lib/configsetup.inc.php | 3 ++- resources/lang/en.json | 4 ++-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/lib/collage.php b/lib/collage.php index a544978ef..ccb0eb337 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -37,6 +37,57 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $framePath, $ imagedestroy($my_collage); break; case '2x4': + $degrees = 90; + + list($width_before, $height_before) = getimagesize($srcImagePaths[0]); + + $my_collage_width = $width_before; + $my_collage_height = $height_before; + + $my_collage = imagecreatetruecolor($my_collage_width,$my_collage_height); + $background = imagecolorallocate($my_collage, 240, 240, 240); + imagefill($my_collage,0,0,$background); + + $images_rotated = array(); + + for ($i = 0; $i < 4; $i++) { + $img_tmp = imagecreatefromjpeg($srcImagePaths[$i]); + + if ($takeFrame) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, imagesx($img_tmp), imagesy($img_tmp)); + $x = (imagesx($img_tmp)/2) - (imagesx($frame)/2); + $y = (imagesy($img_tmp)/2) - (imagesy($frame)/2); + imagecopy($img_tmp, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + } + + $img_rotate_tmp = imagerotate($img_tmp, $degrees, 0); + $images_rotated[] = resizeImage($img_rotate_tmp, $height_before/3.3, $width_before/3.5); + } + + $new_width = imagesx($images_rotated[0]); + $new_height = imagesy($images_rotated[0]); + + $height_offset = ((($my_collage_height/2)-$new_height)/2); + $width_offset = (($my_collage_width-($new_width*4))/5); + + $positions_top = [[$width_offset, $height_offset], [($width_offset*2+$new_width), $height_offset], [($width_offset*3+2*$new_width), $height_offset], [($width_offset*4+3*$new_width), $height_offset]]; + $positions_bottom = [[$width_offset, ($new_height+(3*$height_offset))], [($width_offset*2+$new_width), ($new_height+(3*$height_offset))], [($width_offset*3+2*$new_width), ($new_height+(3*$height_offset))], [($width_offset*4+3*$new_width), ($new_height+(3*$height_offset))]]; + + for ($i = 0; $i < 4; $i++) { + $position_top = $positions_top[$i]; + $position_bottom = $positions_bottom[$i]; + + imagecopy( $my_collage, $images_rotated[$i],$position_top[0],$position_top[1],0,0,$new_width,$new_height); + imagecopy( $my_collage, $images_rotated[$i],$position_bottom[0],$position_bottom[1],0,0,$new_width,$new_height); + } + + imagescale($my_collage, $width_before, $height_before); + + imagejpeg($my_collage, $destImagePath); + imagedestroy($my_collage); + break; + case '2x4BI': $widthNew=321; $heightNew=482; $PositionsX = [63, 423, 785, 1146]; //X offset in Pixel diff --git a/lib/configsetup.inc.php b/lib/configsetup.inc.php index d4d5ea5b7..3c9addf35 100644 --- a/lib/configsetup.inc.php +++ b/lib/configsetup.inc.php @@ -238,7 +238,8 @@ 'placeholder' => $defaultConfig['collage_layout'], 'options' => [ '2x2' => '2x2', - '2x4' => '2x4' + '2x4' => '2x4', + '2x4BI' => '2x4 + background image' ], 'value' => $config['collage_layout'] ], diff --git a/resources/lang/en.json b/resources/lang/en.json index 1289cf2b3..9f4ea58b5 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -57,7 +57,7 @@ "general_camera_mode": "Camera facing mode", "general_cheese_time": "Cheeeeeeeese!-Timer:", "general_cntdwn_time": "Countdown timer:", - "general_collage_background": "Path to the background for 2x4 collage", + "general_collage_background": "Path to the background for \"2x4 + background image\" collage", "general_collage_cntdwn_time": "Collage-countdown timer:", "general_collage_key": "Key code which triggers a collage", "general_collage_layout": "Choose collage layout:", @@ -146,7 +146,7 @@ "manual_general_camera_mode": "Choose between front- or back facing camera mode of your device cam.", "manual_general_cheese_time": "Set a time to display \"Cheeeeeeeese!\" after the countdown.", "manual_general_cntdwn_time": "Set your countdown time.", - "manual_general_collage_background": "Enter the path of the background which is applied to your collage on 2x4 collage layout.", + "manual_general_collage_background": "Enter the path of the background which is applied to your collage on \"2x4 + background image\" collage layout.", "manual_general_collage_cntdwn_time": "Set your countdown time between pictures while taking a collage.", "manual_general_collage_key": "Specify the key id to use that key to take a collage (e.g. 13 is the enter key). For example use https://keycode.info to find out the key id.", "manual_general_collage_layout": "Choose between 2x2 and 2x4 pictures collage layout.", From 855093fa2573e9a61d09ccac40012206cff75893 Mon Sep 17 00:00:00 2001 From: Kai Haupt Date: Sat, 19 Sep 2020 12:58:36 +0200 Subject: [PATCH 4/9] lib (collage): move Layout definition Change-Id: I9739cb98735a89256cfffd5134b5dc7b8a93b117 --- api/applyEffects.php | 2 +- lib/collage.php | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/api/applyEffects.php b/api/applyEffects.php index 7f6d0ba6e..0c148f57b 100644 --- a/api/applyEffects.php +++ b/api/applyEffects.php @@ -33,7 +33,7 @@ $collageSrcImagePaths[] = $collageBasename . '-' . $i . '.jpg'; } - if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $collage_frame_path, $config['collage_layout'], $collage_background)) { + if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $collage_frame_path, $collage_background)) { die(json_encode([ 'error' => 'Could not create collage' ])); diff --git a/lib/collage.php b/lib/collage.php index ccb0eb337..688b1fca2 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -1,12 +1,15 @@ Date: Sat, 19 Sep 2020 13:13:19 +0200 Subject: [PATCH 5/9] fix (collage): only apply frame once Change-Id: Icfea70b2925a519db9a15531db57cbafd1dd9009 --- lib/collage.php | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/collage.php b/lib/collage.php index 688b1fca2..3426396ae 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -47,27 +47,31 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $framePath, $ $my_collage_width = $width_before; $my_collage_height = $height_before; - $my_collage = imagecreatetruecolor($my_collage_width,$my_collage_height); + $my_collage = imagecreatetruecolor($my_collage_width, $my_collage_height); $background = imagecolorallocate($my_collage, 240, 240, 240); - imagefill($my_collage,0,0,$background); + imagefill($my_collage, 0, 0, $background); $images_rotated = array(); for ($i = 0; $i < 4; $i++) { $img_tmp = imagecreatefromjpeg($srcImagePaths[$i]); - if ($takeFrame) { - $frame = imagecreatefrompng($framePath); - $frame = resizePngImage($frame, imagesx($img_tmp), imagesy($img_tmp)); - $x = (imagesx($img_tmp)/2) - (imagesx($frame)/2); - $y = (imagesy($img_tmp)/2) - (imagesy($frame)/2); - imagecopy($img_tmp, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + if (!file_exists($srcImagePaths[$i])) { + return false; } $img_rotate_tmp = imagerotate($img_tmp, $degrees, 0); $images_rotated[] = resizeImage($img_rotate_tmp, $height_before/3.3, $width_before/3.5); } + if ($takeFrame) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, $my_collage_width, $my_collage_height); + $x = (imagesx($my_collage)/2) - (imagesx($frame)/2); + $y = (imagesy($my_collage)/2) - (imagesy($frame)/2); + imagecopy($my_collage, $frame, $x, $y, 0, 0, $my_collage_width, $my_collage_height); + } + $new_width = imagesx($images_rotated[0]); $new_height = imagesy($images_rotated[0]); From d88c3d42663613f2376c1b05072476cbfed6c303 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Sat, 19 Sep 2020 14:08:50 +0200 Subject: [PATCH 6/9] feature (collage): allow to apply frame once or to every picture Change-Id: I4679880a2b97f7a0a5e90361347805ac0196ab6a --- api/applyEffects.php | 2 +- config/config.inc.php | 1 + lib/collage.php | 26 ++++++++++++++++++++++---- lib/configsetup.inc.php | 5 +++++ resources/lang/en.json | 2 ++ 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/api/applyEffects.php b/api/applyEffects.php index 0c148f57b..b20aa22c1 100644 --- a/api/applyEffects.php +++ b/api/applyEffects.php @@ -33,7 +33,7 @@ $collageSrcImagePaths[] = $collageBasename . '-' . $i . '.jpg'; } - if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $collage_frame_path, $collage_background)) { + if (!createCollage($collageSrcImagePaths, $filename_tmp, $config['take_collage_frame'], $config['take_collage_frame_always'], $collage_frame_path, $collage_background)) { die(json_encode([ 'error' => 'Could not create collage' ])); diff --git a/config/config.inc.php b/config/config.inc.php index 9281525a4..95722e3c6 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -43,6 +43,7 @@ $config['take_frame'] = false; $config['take_frame_path'] = '../resources/img/frames/frame.png'; $config['take_collage_frame'] = false; +$config['take_collage_frame_always'] = false; $config['take_collage_frame_path'] = '../resources/img/frames/frame.png'; $config['collage_layout'] = '2x2'; // possible values are '2x2' or '2x4' $config['collage_background'] = '../resources/img/frames/DefaultCollageBackground.png'; diff --git a/lib/collage.php b/lib/collage.php index 3426396ae..1da2d79e8 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -3,7 +3,7 @@ define('LAYOUT', $config['collage_layout']); -function createCollage($srcImagePaths, $destImagePath, $takeFrame, $framePath, $background_image) { +function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlways, $framePath, $background_image) { if (!is_array($srcImagePaths) || count($srcImagePaths) !== 4) { return false; @@ -28,13 +28,23 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $framePath, $ $tempSubImage = imagecreatefromjpeg($srcImagePaths[$i]); + if ($takeFrame && $takeFrameAlways) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, imagesx($tempSubImage), imagesy($tempSubImage)); + $x = (imagesx($tempSubImage)/2) - (imagesx($frame)/2); + $y = (imagesy($tempSubImage)/2) - (imagesy($frame)/2); + imagecopy($tempSubImage, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + } + imagecopyresized($my_collage, $tempSubImage, $position[0], $position[1], 0, 0, $width / 2, $height / 2, $width, $height); imagedestroy($tempSubImage); } - if ($takeFrame) { + if ($takeFrame && !$takeFrameAlways) { $frame = imagecreatefrompng($framePath); $frame = resizePngImage($frame, $width, $height); - imagecopy($my_collage, $frame, 0, 0, 0, 0, $width, $height); + $x = (imagesx($my_collage)/2) - (imagesx($frame)/2); + $y = (imagesy($my_collage)/2) - (imagesy($frame)/2); + imagecopy($my_collage, $frame, $x, $y, 0, 0, $width, $height); } imagejpeg($my_collage, $destImagePath); imagedestroy($my_collage); @@ -60,11 +70,19 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $framePath, $ return false; } + if ($takeFrame && $takeFrameAlways) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, imagesx($img_tmp), imagesy($img_tmp)); + $x = (imagesx($img_tmp)/2) - (imagesx($frame)/2); + $y = (imagesy($img_tmp)/2) - (imagesy($frame)/2); + imagecopy($img_tmp, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + } + $img_rotate_tmp = imagerotate($img_tmp, $degrees, 0); $images_rotated[] = resizeImage($img_rotate_tmp, $height_before/3.3, $width_before/3.5); } - if ($takeFrame) { + if ($takeFrame && !$takeFrameAlways) { $frame = imagecreatefrompng($framePath); $frame = resizePngImage($frame, $my_collage_width, $my_collage_height); $x = (imagesx($my_collage)/2) - (imagesx($frame)/2); diff --git a/lib/configsetup.inc.php b/lib/configsetup.inc.php index 3c9addf35..fc6d84882 100644 --- a/lib/configsetup.inc.php +++ b/lib/configsetup.inc.php @@ -226,6 +226,11 @@ 'name' => 'take_collage_frame', 'value' => $config['take_collage_frame'] ], + 'take_collage_frame_always' => [ + 'type' => 'checkbox', + 'name' => 'take_collage_frame_always', + 'value' => $config['take_collage_frame_always'] + ], 'take_collage_frame_path' => [ 'type' => 'input', 'placeholder' => $defaultConfig['take_collage_frame_path'], diff --git a/resources/lang/en.json b/resources/lang/en.json index 9f4ea58b5..2f40e3e1e 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -250,6 +250,7 @@ "manual_slideshow_pictureTime": "Add a value which is used as milliseconds an image is displayed at standalone slideshow.", "manual_slideshow_refreshTime": "Refresh standalone slideshow after entered seconds.", "manual_take_collage_frame": "If enabled, defined frame will be applied to your collage after taking it.", + "manual_take_collage_frame_always": "If enabled, defined collage frame will be applied to each picture of your collage instead once after taking it. \"Take collage with frame\" needs to be enabled.", "manual_take_frame": "If enabled, defined frame will be applied to your picture after taking it.", "manual_toggle_fs_button": "If enabled, a button to toggle fullscreenmode will be added to the start screen.", "manual_use_collage": "If enabled, user can take a collage. A collage consists of 4 pictures. Optional you can take a collage with or without interruption.", @@ -357,6 +358,7 @@ "takeCollage": "Take Collage!", "takePhoto": "Take Pic!", "take_collage_frame": "Take collage with frame", + "take_collage_frame_always": "Apply frame to each picture of the collage", "take_frame": "Take picture with frame", "test_update_available": "There is a test update available.", "toggleFullscreen": "Toggle Fullscreen", From d93531ec68b3be2259036dbaff82552d00010081 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Sat, 19 Sep 2020 15:18:23 +0200 Subject: [PATCH 7/9] fix (collage): apply frame once on 2x4 collage with background image Change-Id: I8eee49d2432e4ef66ffdb525a33361fa7162b81b --- lib/collage.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/collage.php b/lib/collage.php index 1da2d79e8..5f18b13ad 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -118,6 +118,7 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw $PositionsX = [63, 423, 785, 1146]; //X offset in Pixel $PositionsY =[57, 642]; //Y offset in Pixel $my_collage= imagecreatefrompng($background_image); + list($bg_width, $bg_height) = getimagesize($background_image); for ($j = 0; $j < 2; $j++) { //delta Y $dY =$PositionsY[$j]; @@ -134,6 +135,13 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw imagedestroy($tempSubRotated); // Destroy temporary images } } + if ($takeFrame && !$takeFrameAlways) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, $bg_width, $bg_height); + $x = (imagesx($my_collage)/2) - (imagesx($frame)/2); + $y = (imagesy($my_collage)/2) - (imagesy($frame)/2); + imagecopy($my_collage, $frame, $x, $y, 0, 0, $bg_width, $bg_height); + } imagejpeg($my_collage, $destImagePath); // Transfer immage to destImagePath with returns the image to core imagedestroy($my_collage); // Destroy the created collage in memory break; From 309b29f242ec784af7a549eaa7647ca9d54e9dc8 Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Sat, 19 Sep 2020 16:38:41 +0200 Subject: [PATCH 8/9] fix (collage): apply frame to each photo on 2x4 collage with background image Change-Id: Ice486264d35a8a2c22f6e7cbb88c078a2a95fc9f --- lib/collage.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/collage.php b/lib/collage.php index 5f18b13ad..970c78434 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -128,6 +128,15 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw return false; } $tempSubImage = imagecreatefromjpeg($srcImagePaths[$i]); + + if ($takeFrame && $takeFrameAlways) { + $frame = imagecreatefrompng($framePath); + $frame = resizePngImage($frame, imagesx($tempSubImage), imagesy($tempSubImage)); + $x = (imagesx($tempSubImage)/2) - (imagesx($frame)/2); + $y = (imagesy($tempSubImage)/2) - (imagesy($frame)/2); + imagecopy($tempSubImage, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + } + $tempSubRotated = imagerotate($tempSubImage, 90, 0);// Rotate image list($width, $height) = getimagesize($srcImagePaths[0]); imagecopyresized($my_collage, $tempSubRotated, $dX, $dY, 0, 0, $widthNew, $heightNew, $height, $width); // copy image to background From 1cca6ee4143bd0abf5806be00c60f6633ab005ac Mon Sep 17 00:00:00 2001 From: Andreas Blaesius Date: Sat, 19 Sep 2020 16:45:54 +0200 Subject: [PATCH 9/9] lib (collage): some adjustments Change-Id: I03d2ef1a12fe7b0d3094f8cacf4117de1d90e755 --- lib/collage.php | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/collage.php b/lib/collage.php index 970c78434..97c2ac5c9 100644 --- a/lib/collage.php +++ b/lib/collage.php @@ -64,7 +64,7 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw $images_rotated = array(); for ($i = 0; $i < 4; $i++) { - $img_tmp = imagecreatefromjpeg($srcImagePaths[$i]); + $tempSubImage = imagecreatefromjpeg($srcImagePaths[$i]); if (!file_exists($srcImagePaths[$i])) { return false; @@ -72,14 +72,14 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw if ($takeFrame && $takeFrameAlways) { $frame = imagecreatefrompng($framePath); - $frame = resizePngImage($frame, imagesx($img_tmp), imagesy($img_tmp)); - $x = (imagesx($img_tmp)/2) - (imagesx($frame)/2); - $y = (imagesy($img_tmp)/2) - (imagesy($frame)/2); - imagecopy($img_tmp, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); + $frame = resizePngImage($frame, imagesx($tempSubImage), imagesy($tempSubImage)); + $x = (imagesx($tempSubImage)/2) - (imagesx($frame)/2); + $y = (imagesy($tempSubImage)/2) - (imagesy($frame)/2); + imagecopy($tempSubImage, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); } - $img_rotate_tmp = imagerotate($img_tmp, $degrees, 0); - $images_rotated[] = resizeImage($img_rotate_tmp, $height_before/3.3, $width_before/3.5); + $tempSubRotated = imagerotate($tempSubImage, $degrees, 0); + $images_rotated[] = resizeImage($tempSubRotated, $height_before/3.3, $width_before/3.5); } if ($takeFrame && !$takeFrameAlways) { @@ -113,6 +113,7 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw imagedestroy($my_collage); break; case '2x4BI': + $degrees = 90; $widthNew=321; $heightNew=482; $PositionsX = [63, 423, 785, 1146]; //X offset in Pixel @@ -137,11 +138,11 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw imagecopy($tempSubImage, $frame, $x, $y, 0, 0, imagesx($frame), imagesy($frame)); } - $tempSubRotated = imagerotate($tempSubImage, 90, 0);// Rotate image + $tempSubRotated = imagerotate($tempSubImage, $degrees, 0);// Rotate image list($width, $height) = getimagesize($srcImagePaths[0]); imagecopyresized($my_collage, $tempSubRotated, $dX, $dY, 0, 0, $widthNew, $heightNew, $height, $width); // copy image to background - imagedestroy($tempSubImage); // Destroy temporary images imagedestroy($tempSubRotated); // Destroy temporary images + imagedestroy($tempSubImage); // Destroy temporary images } } if ($takeFrame && !$takeFrameAlways) { @@ -151,14 +152,14 @@ function createCollage($srcImagePaths, $destImagePath, $takeFrame, $takeFrameAlw $y = (imagesy($my_collage)/2) - (imagesy($frame)/2); imagecopy($my_collage, $frame, $x, $y, 0, 0, $bg_width, $bg_height); } - imagejpeg($my_collage, $destImagePath); // Transfer immage to destImagePath with returns the image to core + imagejpeg($my_collage, $destImagePath); // Transfer image to destImagePath with returns the image to core imagedestroy($my_collage); // Destroy the created collage in memory break; default: list($width, $height) = getimagesize($srcImagePaths[0]); $my_collage = imagecreatetruecolor($width, $height); - imagejpeg($my_collage, $destImagePath); // Transfer immage to destImagePath with returns the image to core + imagejpeg($my_collage, $destImagePath); // Transfer image to destImagePath with returns the image to core imagedestroy($my_collage); // Destroy the created collage in memory break; }