From 9a08ed3f4966b66b380d02c7a49617ecac9db3ab Mon Sep 17 00:00:00 2001 From: Wataru Sato Date: Sun, 5 Jul 2020 22:16:07 +0900 Subject: [PATCH 1/3] Initial commit. --- kadai1/wataboru/.gitignore | 3 + .../wataboru/commands/imageconverter/main.go | 55 ++++++++++++ kadai1/wataboru/go.mod | 5 ++ kadai1/wataboru/image/free-icon.jpg | Bin 0 -> 23543 bytes kadai1/wataboru/image/sub/free-icon.jpg | Bin 0 -> 23543 bytes .../wataboru/imageconverter/ImageConverter.go | 81 ++++++++++++++++++ 6 files changed, 144 insertions(+) create mode 100644 kadai1/wataboru/.gitignore create mode 100644 kadai1/wataboru/commands/imageconverter/main.go create mode 100644 kadai1/wataboru/go.mod create mode 100644 kadai1/wataboru/image/free-icon.jpg create mode 100644 kadai1/wataboru/image/sub/free-icon.jpg create mode 100644 kadai1/wataboru/imageconverter/ImageConverter.go diff --git a/kadai1/wataboru/.gitignore b/kadai1/wataboru/.gitignore new file mode 100644 index 0000000..43d90bc --- /dev/null +++ b/kadai1/wataboru/.gitignore @@ -0,0 +1,3 @@ +.idea +.DS_Store +go.sum \ No newline at end of file diff --git a/kadai1/wataboru/commands/imageconverter/main.go b/kadai1/wataboru/commands/imageconverter/main.go new file mode 100644 index 0000000..060d3a1 --- /dev/null +++ b/kadai1/wataboru/commands/imageconverter/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "dojo8/kadai1/wataboru/imageconverter" + + "flag" + "fmt" + "os" +) + +const ( + // ExitCodeSuccess is the exit code on success + ExitCodeSuccess int = iota + // ExitCodeError is the exit code when failed + ExitCodeError + // ExitCodeError is the exit code when failed + ExitCodeInvalidDirectoryError +) + +var ( + args imageconverter.Args +) + +func init() { + flag.StringVar(&args.Directory, "dir", "", "Input target Directory.\n ex) `--dir=./convert_image`") + flag.StringVar(&args.Directory, "d", "", "Input target Directory. (short)") + flag.StringVar(&args.BeforeExtension, "before", "jpg", "Input extension before conversion.\n ex) `--before=png`") + flag.StringVar(&args.BeforeExtension, "b", "jpg", "Input extension before conversion. (short)") + flag.StringVar(&args.AfterExtension, "after", "png", "Input extension after conversion.\n ex) `--after=jpg`") + flag.StringVar(&args.AfterExtension, "a", "png", "Input extension after conversion. (short)") + flag.Parse() +} + +func run() int { + if args.Directory == "" { + fmt.Fprintln(os.Stderr, "Input target Directory.\n ex) `--dir=./convert_image`") + return ExitCodeInvalidDirectoryError + } + + if _, err := os.Stat(args.Directory); os.IsNotExist(err) { + fmt.Fprintln(os.Stderr, "Target directory is not found.") + return ExitCodeInvalidDirectoryError + } + + if err := imageconverter.Convert(args); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + return ExitCodeError + } + + return ExitCodeSuccess +} + +func main() { + os.Exit(run()) +} diff --git a/kadai1/wataboru/go.mod b/kadai1/wataboru/go.mod new file mode 100644 index 0000000..ea030c9 --- /dev/null +++ b/kadai1/wataboru/go.mod @@ -0,0 +1,5 @@ +module dojo8/kadai1/wataboru + +go 1.14 + +require golang.org/x/image v0.0.0-20200618115811-c13761719519 diff --git a/kadai1/wataboru/image/free-icon.jpg b/kadai1/wataboru/image/free-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d49627e7067855b54366049ae2006c182233eac1 GIT binary patch literal 23543 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 literal 0 HcmV?d00001 diff --git a/kadai1/wataboru/image/sub/free-icon.jpg b/kadai1/wataboru/image/sub/free-icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d49627e7067855b54366049ae2006c182233eac1 GIT binary patch literal 23543 zcmeFZXIN8N7X}(Yzyd1L6af`fn!tzz1f)1L0qF^mu2e}VO7B=vKu}tc-b)e!QW6Ld zu+gQHgpPC)dhc*EUzr(|`EL7h|J=>z`=j{cdN%wId3Q%M4pp01iQLDi%nm=a#O`RCWCNR8e-%1JQ#!h)Tw&U*4^_( zR5ZM(w5yvMpY1Q)|Kk5)W%-lMpVmGA6CDkeI2{W>5m58-zxMzC^Z%JaT$lm z%r&iv>n_Eq;3cHye9|+FkRG0v3U-e-AUkZQM9@QOUFc=(xs6L1Z~YR9VcJoqNYl^A zT(3_z`oj9VQj{nQ!_}?lMAFSalSlCpM#9((b?F!jIeC6EXxHca$rkl0d=BaEJ7pX* zhc$uS7bzhZASV|%&~?3Lj;?D~wl>Shps2hKL9SCHd*ADaRqGjv;B>Oa8sm4@=NU7f z{J-iPHD>D}yWUkEyPR$(vKU1Un{7FaqyIe)2R3hN}FmItPk zS;3LMfidf9AVRjesrT;Hz3{iiG)m4*&t;^R(@fUVi-+B-N~}PaZICr~Q)jNGnL0XvTDL&9)$U#z0(t zc#@sG`BdcpY1jJ`Vq-ihnh85E!9ZqaZs&wzZ2DZNV5XJp6n-A0hGDHhJ_YxOEkWBw zF9!rF=CCxQd&3pY0zHs6xgQLhl51pKjcVG)NUNUmDDoswDRa+j>Ga@Le06c?LQ40@ z*>H&9d!tJvXx2SanaWDh3|KET1r4{qG064g_5|1!m4rm%37}ISslEH}Mk7%w5_CST ze+MCSU0b!Vp$Mu2FFV>4y8*LO>sGllqG1tj2)wzP3;#`Q!-ZEofd}E7R=*b756EAzRvBCkPC@-mmIiG%&Z3sM>V3&AFoeTT`gR zsMnysL0y4$Uv*O`def%%hz_pKlEJr+#91LmNQ4yGqnS`c@%$#>b^!@9}(n1KvDqzITuG4YbqAC)1H;xQxVsTftxp z3X<{rFH|t$$(xxJ&ld`$=al~W3Pje2)lWKGSt~BYhtVa0Cv)rtQdtelqHk0R96LXz zLe}e?jG;^>&3K-3Zd>Kaym{E4s9 zFNpusKr856=xw53`b~WAl;d0d!2-u2ZI&z`>O zFE<{CtCfBxP58Q)3dfY#SdyTwLyi3RkVC)QJvjvNA5F&>hsE|6@p(O2 zbwz8~Nv?jMT(6$;xP*w{?#6T9JV+p`wd=_p#+>%evuGD_r6!9^ijf;CK72}{+bm)% zX2OdMhrJ}C2MP|OgW^Ha2g7gYz-x>B9PTU!Z$&b6zaO2vurC3`?Sn%!0adrcUMIpHJ8ipNsrqFOa za(*6(WMnuT3UDEyfb90ii3=tA8QbMm+O28~tI%(nh6+(Gxhe=*#fC;$zaLjsRh?jC zR^RmAd}S)l>X_acaIYYvbS69}HRl*0VjFlJVBHq1EcgDpyvb>E=O|9t1nX>nZly;2fw%Y?a&c zC%wp~iCvber=vI`9BTL8NaDGHu(PpmfYFt_@Yk!mrcE^MPkzme zYT23d(n^k)a={xrvttwSIT^yu=A97`Wqn=!6Ol_=Z22HJ?s`69VR6AUX#JO(KO5Aa*2dq z4e~=aNPNpd5WGxdnin>Vxt&&R9v87h7Rdqg!gU%L)oJg|9snG0Idf~k_a4tYimZr6 z5@okqE{E8J4ysK(3b*#V9NqFcOMf|Ou>h=wX?mKUOxw2~I#PMky!rqjq1}-qLF6%oVdMZ2>Ao`p7*|M7AF;N)rfHag_%z zi3gf<6~?eN{n|-X3!~i^H||tjSJX+TU<*{yZ0@=Ih>Av^EH9N0+Fa|Pbr5KFvd|s~ zE>Kkk(OFjV4v9%u21rCq34H9usIy0KnX7%x^s>8)9>J`JyP~SOvh~4L%lTf{k%dR6 zj`SW1`HPX)4P}A|ewdOxA)A^y&=0F!k_93Q;)S23ln9_1xDR*Fm`i0WpbkDQ zeJRoTEqK8sHm+$K3RzKqJtpc~k+cQXCL(=8aa=Y7L4Tlun znk)F3srH5gKwp4lBrb@Z?(4^2(*47*j;?{#xs@^N*JHG3P|Nd1KDR29bJT?m2IiK9 z{Z*L_4T&=PihgF{e%@~SO1$G3|Z%IcQW6+?8u4rPnq8f%FL)dKSZDqep>ilibkkorVqZV=%VtyhCAAxNe z5G_kBZF6NqT~k$4R)Ng?r{v29wR|2DcZP=aTU^Bj5fsMu!-0OV(o1a?EwJ>NzPLJ6 zx=;B)VaRMpt(b=2==z4SUS6)h-4xIZ+bN;E%OsVVInzm`0RVKyf$aUy%VtjYIo?xs za)c#5OnPiB?aL|80Ws+z?C@oy*Y4~FZ(W%9eZd(}avA`j$jrNiJEU+%Qy8otM-bjv zaggWZkW+#AzeywXL;4Z(JNYiCq`Z(pr7x4kP;-(o5TXavT&;aJk~}OTHlIbA(e$2* zG~)8C9J~~kBe~1PnD9die<=*%xA>)laoQnLm3h(@Rj)X50(7Fygl)h9w#dtr1X45J zQZ4nC#y%rFga5%i=exf=|4E|zTE<#%uXIVwIkAeFT#?*-IOTzfKOSvLuql517|by0m%{eg$FeWh-H zS)}vxZ;0qrr21z+BuxU(hIg<{B|6WU`Bgh)BtgglrJ3L-ubjC4ax&w}E>9k7jH5yLJnCTZ&GgwW9@UQQvX*=0Av^3eHHLUYDCj z^uL6zgC^M7*_bn(lpo()pO%Dh5>7}*YPjdwf3$-$$RV7{670%G5&QTPO&Vtk^PQoE zCz>v5P)FJSNn^_2M9!COxe&$2b6Lx;^*LpN4Lf9(V6j znHBX;^=1zF=YaJitA$3Fb4zTiVdcTkO3zL~w)tg#gyZwGIGSNm@Bu-kZjE_hG-`YpmA`c(GNh+f68$<}Kp#Csv; zDlNMhkX5gvZrHbZeE)h@=>^?D`5Orpw8cWR5(C#;UVt*5?i{AfWgWhiQkp%`aTo5TCb^Wx;S`^vbI~s6J$!=R$F+Q>3`A;HHEXE* zq0*iXb{M`F9A*lLWigzf`zW^2KXlu0scfc}xM56Q@>n|qYCHgp#kT6*Ogprrel;E` z=(QW2@vJS}3{KB4-q$25&dMvNyNFB~i&%Wka|PlDHo1wdUpM?8ri7+BaYPhHjj3xr zN<%y=4zAz;=^On%?(bSFqW{g0J2|#Mb%GtRt@JAhKq7ur8pqSAU9PR!#gr@5{DJAr zr^oQrQ(v5btfqOe*<{Ta@QUmOQJBJ&kV)Z&LNz%=_*mu>;gJRR2)Cgr`311s(8L57 zLI5ir04^Q^@IOqRTr5abz`R%c;q}E93o$U6R`s9eHU*`#VY7yNX(fxVII= z+BPp5*!M#s@t!L%b?!*6zjy8}Wr)?e@!TC!cFJ-xXhXy=l|s>Mh%K%kWC2&L%Dte# z-W^vUEzs{0>zCs26?Uat7+R5GUgl^8;S-sr!`bi5&Ua|Z;aOM0pDMD`CSy1?*ZA)& zbXvf!JbTLrIOP$D z%l*byfAGUUEmaoWBw>3l}nZ8=)pH>ISJ0 z7WU0}y8rPo2oI)V-NgXS58Y#2&tH$l=g32L*D_Yr*=@LY{=sh)|J8zrF0n0KWubnLuX}oD@L%~zP(;( zlccsgLj&rUR(QS@cNwaYOoiiOA>!uJccByWWd2B{qWg!(2@?7qoO2F=d=Q$Ek{%J^ zeHkkA);jtXu*IS&G$oJTZD!#mu?JW<=8U}?sLlHg>Eq|p6UP56eA!P_6=67%lrl4M zS=V&~^7KyM)`&fB?(AlNft<~A<42T0v*y;T^^K2g9GX`29lXd#@iC9U1dN^NK)hh`& zW0uFpaqmu%0RH5`GstR>hy-@f{Oc_iNdG%gb!~rE51kcypdAuAbm_SdTD|dMQAdkE z!hUxk>dy9AlZDzazQD!H9@5Xm-eD6wi7=xqU8Bjek=)>jXM%kTM2OmCLxJkLitFPw zy_;IOPv?(alb13NYJMmzYrfUj&m(Fo8>^r?9f6GZR$bew+y{6E8h;N#c56pIa&qdL z4R6_ZDyul&FKys<00`U5{k(YOR<|w_e$t^|7@F1Tv!Z1yEwUbQ#aP!9vb3jpbEuDS z09aP+J94pR496hko>w%%A<`=Cn>h!0SYgnt4(3!O1=|(P?F%w89lrnmu+rEou*uF= zXyE#t&%5Vu`Wu=$^uK{zA6S*5L>OONUQFJG+j__a)F@Q#=>dcPF^-y(NALcS*Ey!b z?md}Oh~>an8<}jpLK|MaGwH@EB`~fjeBEZyQJ3;mqhjZKBjRR-k;VGXdjlvqI|={Z zW6cUX^giWVC<@-uT{ybHKOL?o%qZ8Dzj9Z+Yjiv0)ws9OZQa53#FopYQ79SE%GoHO zY!5OyWyqwuiSh2gS?xGs`@=^^lpRX-j0T;{WX7_w{eq+ZYwWB|<2H{~*&Y`7B~6U5 zu*T|%qwFnMF0ir}>TMWBf9{nPcJh@`msZ|}yo3%xN4!L*hK_>S%d%G56y{)f-?w|K2{-O6hEB&*B#BY&w89g9n$3T2Z|bV=oCj> z?lEvRJx!2UYJt>2n4I!;*oCLbM$Cjai)ZcoP4J7QRD7Wv3?~~0S~PuG-M;0I^0ZanwuPgEAWi6SS*|JHELV4p zH7lC)AOC63oT}(`Ei5rZZ-jwC-O^gxcfs(!>9~+fDU4Z>cWT#-a4dSvpXS;ic^*^B zrENxeRl$`K#kUPTb6?Hhc72uL7cLic6qy+rvU!o0_)i!Bz;wm)99bXa`mv$_&Cg3! zL!YQ4)oC~7Y|eM>Nplv7DQeiGn~{3u`VNjg zW~$+mk+s|xefw6(60^qT=xlWCvRmf?ApYj}<2ipo%VCoph%l5)a+q%E#)X2$<$U554 zUDa-32n$zws(%=F%_wJc&h=Ph=lAofHhCVRqxFxUt`b09Hx|^d8Su#K8(S zKLm;FRCKF%fzMPh++S$oGhrv2*7L+6D>PrKZnyxHs82UE6j`}U-&cj_=2CSe zn=c@0#=Tx`kX1FIvhE-a;hC!=24}6OCVlshCgDs7%#R#rZ2P=Q9j|vw1&LqoHeJ;( zaLQw6;kV24GfWN6a`AW;8!=CGYmS@rMJ{!+Ui&M%+jHZN)^|5x5gLXN9tD2nIx_H$ zrM^SDy2ck7qfWE4NusK<$UWaoi&@Jm5`zvfPIZk_X{EU!i4v%&f4^Z4M!29T544rQ zwL}y|II~<0)`=y%28z1!N46*}fA|aM2Pv+Sg{c0}lf0TKo`=|kF?UW6xLk8xx9=^B z)ufKR_4|IkirWCkf4)nn8S8&a;0j>xkk=z<5KmSK@Sw|0tr8@o$;aUY*}?xFe=4b2>t zsk@RDR^VrDT|QAjHp-7#anH1Uo5EQVJp}{PUEo4x?x*V;4p$HFhF9t zs9_k-u5t>bD#>PP}k1=O*)bBF2N*ABUyZz&-#=8io|P za0s)o9g$r+3F>^`Z=P?9_Y4QIMls&CBKcfF4-pZ!n)PR_EuUvV7pIhUlB=&~8*f-a z*C$Z??+Fw-W7EL?)_A8}-D&rYyN->wl`q`gKz*H=gbc!b^$St?iEAnIa(s`70!?+8 zyw{B7PyS8}P$14?4%eH1rJdDuo$IU>u|**h?x>kw1$15wpVV+-l^ZUsOat!}uTP-; zx|yQ8yFeYFZhfL*n})Fl{|G88K8!n3gKHK4*1FsXhfER{yzudd_UFGvSTql6LgHj38v^VCJSTyky-99vNX-XBl+A>i(ZTKM8a~)neNjIO42u5tm5} zoRCF4eu9usYbkOZv z@YM`7eM)kRM$(XL!^hWd-^;disqU!23*Y(3o0 z__B=+nwx6VDRx>8q!+w9JOF@ZnPk*y`Vb`sT&dSmzReU1j1`~l84W>h;D?{_xiYX} zycF{Z=7!zonuRl(Ni+O73!*@fN>g84Gq=V}pOg$&>NA=tB|!H9;Dyl()tpMVz+7`d zQw}g1jB?dT37J&4Np~a9bp%dTwxlj;oNr6xsQ8)6Y15#J+OjvSw^!bT^6c!-Vg9W%+I(>hgR{hq;BsukrHvbAF(DhU92bJ31Ys;TZqkau&F${6ShrciOuW4@&#*|7xZAZ2 zt-&UH-CG5gDip6wljMZ%5ws3V-s>b9!jm7-|EtkG;61k;S`l7ieg&S9E`WRR2y7*N zc`8+WHe`^UUvXNC_5g5NAnm`K|MY246CNCh4dCcZzWK~O)PGDQWdY0;Ko)WYA?vRP z*|!#k4C4`-PZK@>bZVF#+2iL|R_)*!3KiT?Y@t9twFW5LrVa$(s3B{IC=Nf7;`=c? zV-oeib{Gm7iMw?GFkDV_76|L>TEP%Bkz2MPup?W05zpo2nz!(qeFc_j=iUs(g#>3f z14(yJ=_qt}1)PgR9uM=gQ8O=$3~-kCihL77oj(x>ZyKJd&>5h&_z~)F8rOxz+ilhS zY$R>56dRXbX_%d%V=j2-0PyhRws09=VB069u$}f3gMV}RyU6r;vu(=K#aWs8v(S{W z&~Mxl$FB*{I1jvV8u!#y6wNyQeIc3=Eg6+&+8AHx&jQ z>z)|7d35^+s2`Nlw?}W0uWJwMjdeEVzcP4iS{ssYSy5t$l`G-gSW+6-9j-6uD*eIb zFNNv8%b29uhIir<{ML}WyYb!iqufcWtM~XLI+GP&O{dm(AAJE}X5QrKIe+p-xqr4v z=uT`KFGg)`Y(i5Img_3e+~l^TJyjFPTIM|BfAO!t008^>>IGIauiM1AY+oUHlsJ(C zs|h1)Odv30274qa6&+K3qqap$Pw61Jri`!Y@n$HIMz=Si3-C$K{v54nOC$$!#lQR; znF77y<(%8F2DV^fVeMsoL9MA;{vGEhIr6+li+OHhQoDa;tA{+WOsb^TEgtnbo84AR zNJPGC`&bIYKa38VMRR8m9A;a$V9BSf49%vl$pV9P-lthLtWAJfiv=p4J{y4V7{}On z?IwIjQg%Zpz-|Sug|}KDH*%tDYQBBHsRVGC`DD>vnrPiR-+6s5V9Y?IlbxapOV7cW z^bu5art!|cUfVQ}l>Xw(IEnr z{g+vCJI!yGoDrj$Ty|8e&D_!m3xnvdcA%wu7N|bvg1*9L^fXW)ft+BUxNM1 z5bjskL^|Gw{a(zWy|{Mzep!MhSA;%$tn_h6hapa8LPo>R1z=?c008|)n4LCx5{;o% zZw2O(kUPecZf%KOH-swo{DQ7`?E*>`|3aXXQ@CQm&pHk~cXCjYV`IWvPh@U8KF^(% z58XKI3A3$!Nbt_pt(1IS)l^kC+~RR9UG?H$-iJsuC5orspxs2{o%UzR$v5(fYCaIC z%bQe+2)a7eX zjXG2(A8U}*lItHzvJ-7}b1Z;)$ahXW(0z^3Q&xVQi;j;n<65uhPl?&LJiUb&)Ze>k z&qVDG(g^r>igpC~+Pt4dob0!#>~LLz+Au6_B(wSq0QJel7985gX#DyRrmGD zoxm(g_L1Tt7q$g*Ua2)@?dh@#Vz8JfQy40p>xn7G$y&CLGgUr0ERVlz%=()$57|U` zpwifK-2vcbTn#MQrG;JmcyjN`x1@|MbCHH~#DRi+=@U2{%qd>%?yRmZh4XdkFpql- zd`c~>e~hQQm?)l6m^5K8-&03({0RWSP~$JAI4YE$x~+WxDBaK#*!&Y2(Cih~8cA`A zbM1r^%*X{p$gb?vNs?0?#f?&j+yA*fbiU_IICh z6<<3c^Obwj_Pw2P7(U6Pc+MG-0h;QHNs$UrqTK(B`Y)2$%%?M(@1S+qG5=kXqh|1U z$mgKt0I%qoHpS)P-2HjwJ4!$M&}MI-M_;{|mLxezcVJC0oDiW3L_r*pxHdkGb%>O`&W-~8B z6&A_PS)B273WC4Tc{dTY{8r0-<|1Wh*uhv(7`Nr?x7A+RUp7zI*UqK&vJIa8`nOJZlUo>eE#zC`)Fh8-IM&J++LcB=;Eg1+=8l9Tb^ugHg=#ORpd)D zEH4~3Ukp~EK*Pd;SAO?#h6)Ha5{5rAZ9n-T_x~s~uzlvTpc1dgk29v;HgVIgxQykd z_zKUhrBn|O4evbZp8na(KJly8*Se8M=mtqnXRrG9J|T0_N5ZWRn&*=ux zFyrbXI?8>4Z#`T;gm6)h^2<6^=DYSd1K@n;5U zRTu{M%pe18_G~6k=@y=tWvEd4y9;%e3t}PS7g_bt`I+8GPq;s^s?7um%`YY0H17b4 zrog3S$=AemrZ+Ax{T`a!aT&sw83}0mGX$`CL>nxx*5Fhpmo^vgkT5p+JHRYJL6G1`dVM)eUN1Y!`#J5>WT8n z`JW$@>FvCe=FW=^GQ?SxIo%9BADr%>4fe3j<&9Dan-e}C^C;U%Qrs64A`O-lw>QZU z*Gg;>PCKVvb5Fb+JvtUKPJ|W62bJC}-7vkOpitTaV~=BUjK(7-MwlS zjA6H9Ggl~NtzJ25I6d3tX!13aLZD$;VGDm;IfwIMxzL^VE2vKlop*aAb+)I6JPka- zzbV+&m!S1#`D3a_O$V+zq`vC|%b~M!N02>pX5FUv{`__k{e@O1(ENnVmhhE3mInYZ zg`xY&Pk6Kv&H@j8*>O9%pD2M>SQkncx1{_jM1+Q4hA!w1C9*(+EA{&%Y;2)TSN>z$ z`uMFYz%dPC1@-uBHFx`4h%1K_I%Zf3xYXd9LjUHr2x4=5CE74k}j}eyg2Y zarR)w2F6US+p5m3Z7L1L(;MuVioBW8}_!>f#5OtMW z;3_R{E%9?Ilnb#0+}xLQ>(~u;&XuZRiRH_1Bh7EYn}VC~hU-#3MhfpKee?8H*q4rX;s1NER9k}II__&v#4vlHiJCLWMY~(_00LO=Hou@a@U?eb_*J&@y-}& zWDyX^2TxCWyy>GjN4uhQ7+Jd$bt(Oe{pp{aujMX}Rybr=eoIZA5(u92w61iUZ4=+y zqD?!@5Ac7fD*$xoEH0LobSy|e(g)pWj@%MYAufk4>uMb-Ds&FGH?DW-BLH9-_Y_^9 zQR9k@)!-a;SQ0KLrN&lk70i0MpsKp}KT5J4hEFGDA>QTlMOtz~L-5kam>QCRpg zU>5{|$ZxGwrwqSlJCrxA#_VXQT=1;t@R7HE=XtZN!Gh>DN>2F~Im4P_)J;99&co0E z47YCGeQ547%u%JZfmMwvZZ_;r)l6isaM%6*_WM!lqX?(v_qUIiF`34q^4z=5?DUqF zklfD$5A1nvc}WaQ~k*W!`4bL{u*1TH#VJPZfG6zyHquR!O=^&C8* zexcvf-?t1=T}Z}!(&}EQU*QfMR}y&y0Eni3N}28toLwjl{g5#%Nm)|q_T2#61{9;l zcZ1aTTa~)=4vWsTusMoH!JS54Pp)CRB4xf!Rq(al{=Brgn5KXBFo$EkBdJPdqKnh= zvNCU$XT*VKI2qjzN67IAMc=J}Cp}LNa{`=mT}mnmNUrz>9q-wEd$9`z)|$Li!D1Uc z;+o?IJ^&Pq+uYr2$V*icRssO7d3_F^#m>!NeatG~mC;YW7@s8Hy+p9KBKOMN(y;Dm z^(Qsz8SX~at-@I(l_HrKmMzgPOj_>KF zxlo^18z131HuT@bqe4e4|;db|B$}nkZ(|mg{Abr{*&WA{OPq7{eh(rD+9pq4P6bm?-Bi>M6T8Dw+d5lOyXE8F_5@oQ?@YGQzknoa%QORYIU0SyF;LuLcI~g1}pd$P_9ji z`^m z&VJ)Q2E#Ih><&0_00_|-Rex77NE?itHY8Xo<)0!P2eTT^?^56M*v||m|vUJrxK=f z?o&|TW1$M1hM=wy;?B#u_(8aAB}$pMTwSb6a&v$CyBRHs;n;ONuU+bLMl8$Yd_b)9Q zG92N#oa9A*rd}MhJ6w}?UiJ_qe+;1%+b7%{?%tA{kru2O+Vslp3m>(Bg!A6!qj@$^ zauLz&nja^Orfhyom@)Q1QCxBUeT~C%Tdo@x3u|Ba)~7rW>MMVVbs}LQLwgphU^q|Hsm>lD|Ng}A~vX#HcN>*6V!>l zjh-7g*<0Ft3z@(94W2Rtzt(G3)wqsFh5CkE-i5ND^Y%I~o;l>!GhD8|r6#&1A2tN) z6G6G+)cS`pg% zqz#VjZ(0HTK}{OMyTk)P;x2%A@sQ5@!vvaob2U;h2Rvlq^zx>;J8DiMh z99+sCuCg{Kf*5z*0fwUbD;SKQP^XwWH-WI7$IOOJ?kBg5Cwe_Jlby>GEo!cL^*d^k ztzFzzHWSn;V>j;I>t3VN{Qd{V4~<^iyB^9oUQHC;v|&GKYm{S)-98>_vmX`Q_ZFv# z+LZDZIsjk*%}PIb{YPQ`&0EYte4H3!Ur}j(r^pPbu;1^I;Uyq%ggRl)r2t%4C$#C2 z1Zv<(+X6IhPYw$~JxaSgSdW%KE$HLPlfSn~G$!`K^1T!qrlh#0FVLm51{o)tYg^i? z=>7I3@?a8)=cIZ78s5lX!&}9pVXqT1zbMU#Ev# z`(Q=QuaxkAod=b{c>Lt8kXfWSL9J>6xdZ=5W?6;`(< z6*aDD`rb54eSQG&W;?84LeqTD(aS7l%eF3G($K6hp4mgbxWzd{CdwCyGi74Au2AR~ zd78O#I^sR`C89f}Q<`WkwwQ9!;0Tf^$e}Y9c)czRY*_ES(pnf9#7Xmy^I>!nf!F)! zw^;If_REbQc3umDIGl;Q=JU3OhY(o0kK(21nQmxIdg z8~P&aOYaBZ*R(*$Gr5d#d+|8+NK9VaB^e8@*d@%leUC_t!uHc&&(OPIwG3R->k#Vd z@vla+K+`R!0nZOm8?Y#<%tnS?>-u(Zq2LUdkxgnscYo%{ef7hxEGJABBif~*!K2BD zGT$qStR2Fj3e1A)@Qi@VLYqt5@a*0yQT(!QM3CsyhqHIrSCVWJgVogT*B zu1iOhv5JhCCtYvI%c~A${0abE05dz;7Gt9(oRN9y<))JnIl)-QeAh3MI_mZOyhH2- z)JZ#bKo9)0m$h<53r9wk8AT|Az$DUG3bjQii$cKe;*pOdq?W#d(N=glJ|LN&wM0hm zmn(U2{|?dfp(nvZOW;|_hy?eup;^djBjn}OheIY5cYm|}($o1R2Y|^vK;8XAdVp~? zRLCBF^J0WXZhS+-11piF4H@r${S-jn`D;CP1B&yu{RJYygF?L=Zjmys+RCn8MuQ^n z+d6RD2A>fObHCp+8q-5Kc*X6qYIdGk8bTV*N+ehcNGngXA*CPG9a<9E|TXA z_F03Aap6;`i|8QvahFS4X#fE29Vb&)V`m~Juom&26mRP6GJP)P2C0Lc*l{DFq)R3s zC0XdQ&Ym$B!NRl|B=sOiHa2*MfiWDaL*o^^5i;TKl#d~nltib-E@`$IX|Z+~^K(|3 zg@#Qt`v1t1`Ve*_VR0bS@KMW=V&WDY56s?i5et=GCRsQ~=67?~^DiX- zGI`V_D%1|h?!|nn1=_o%p^|JM+hQ~iztRVn%1o*P-b|3n6^HWWidpL`-&>cPNW5BN zvV6^xeB1BC5ZMY{G9;Mo*u5sX0=&Robf?w`R{&iOed3z-_cVB2P}}Jd53%njw-NB> ziJnJcAd+xiM+2!_9??aA4T`U73Q1~+-_cR}jXFKtJ9!%^GyfnD2Uf4OkwNz%mpmfb z!3a@Mm_XbG17s$@D%r{p$RhuQeE;tt|CUdgx8pflr0J12v9b4KVDdAU^T;WfIdE=T z=G#dG8sQqyGh#1h>0!Y&WHy-*+$pK9{@WaF=dP~iBNNr!BCFDn^hJX${n`@;A?{l_d3DIEUM6+l#}E;vwoZLbmhOj> zhrL&woV#e1MSh~?S7&+mv*YiEF`D-v6H)kCN}1_EUQIi-*ruSi?V%t}3|Gp~`?CZ7 z6c}Z~t&JIM-x)8N8MQrXkht{>DSKWN9t?zMUc8XW}Wcb^pk%lMnX1f;0rgEMxg$v_Bo9e`5Vxpsn)i{g7nnd2iX~ z-p*W43f8)N-$F4~KI!)3r%6cD`GBJZMsB+UNg^4RDn_V;^q6Zqx-0Uc&4u@_rdgNW zf?TW5HSt3yR49a;tw#Gn=J9V`PFnXNNf`YWFf`+7*AwdO#A0vC9#Gr?0`H3yXpsyh z>rakz1?WqZHM;HZnHNJ`-)ZmJjAiJm=gNyeghv0qL6hwl{uxn%7HUK+VC&uMJ<1eU zASZ0KqGNLkv%wHmz90^qf}PB_ktW{uztZ8uE=fz@?<)wi^kBd_h`1&UIr;iUG|jJV z_`I)%7#h~Z9_MQoUf(k94C|g;K3m`DDmV1t-LPvFe9X|h!PR6tEO~iG4{y*7CNz-k zVrSOe29S(@9P2+d&udy|8cV)KwY(a^%E2{aY=EMf#XZyf)VK1l22n7GRUHb7I!eL% zEFfm^?1?Y?pD?IvGV_o6Zap`5S+y{)E5b{3_S}z`31FrxU*OAamTahz9Q`>txt`i+5Rr>q-s7cuE^MMK>kP1~{@niZr1@lGnfyi3xxI8Ab zv#A4DGv-aaV_*1vf9&zbly9(GWtrKfWZ)6>Rs2@4590Y(ZTHPq-MKI zg+=WSVqO9&EE7iyb`#1qs{}+u2(4*gi`~1ZGXkqa;k3gKXN1HgV+iZpNGOG?p&!WO zB-ekxZ#%TPlgxg;CvFW}`{E*<%t|?~*e8j&BEY9-jh){D} znec?A8YYjr%$1md%%F)#rp(t|8iW@@Y@^ZUm2~yH&7O&4XT&$M86iFsP;uS>%?t(b z`j&AM=JgT9pLQixz05I$tw-%7HCxxZSDsJ6p1o{kxs1$mmkI;v?nf1)vi0$i;C!g8 z`qDB`iEy%Q9hjY{@gZydeLox;&>4TJag7&y*>OSrQDIJc*yJWOFl#EC-E0AZ8vt^# z9#)3`fx;4x=0M8Rha1Vf*_3s<5TlRDy2XTn2Of?3^59Yy5sLZ#8z{ZkjCyEwgZRz0 zh2sTvB|MMo3x7k)+oIuuqgYTG;Z_^=N>*%@xF_xs1n3PK@q3!=WQBL&xScQ{Rw4Sr zRyN=j7}u#BZZV%{2LWxS~2(o`@WrGpx`<}n+4Kd@c zd2v3*n|^|$qEXRc`2f%{FzznA;Pr8HsD?8^z70CUuW zRpfrs*1H>{X%tKQ-zPB&tJU94>R9sLb7c3%zavlDhfS_)+@vmeob_mj{7#aQnf6Qb ztKeCKm4h~v9-A88PWQ&xgKwc%_@Xc8hjmtDN032J!}b}`H= zFI05FVA>pMnNdQf>}|uxUsppzQ?{3;&g^@vb=-Z@L-8IX!$>R6CR^3qDr1;^8qzA)ot%(7>l*ZsgDxjU zB=K|CWLKBD#6XatQ_L>^!{ugoH?59^ZSyl7-MFB0m%Y|KX}#`OORsAf2m-}#7nF*@ zg5=%noRnF7v=W{NnLvj}oo@2%CU*ShcX z`|!T)b3W{S)^GpzI%}V^e|)gy1~2LH7aF2E0LPwG^pb(f9siJlB!l>S(qIc2s6laO zpund&hnG*I_UNa;_jnT|%-yqjNg>;^Z8azsINB`CNW6EKNI;AXmn-@s|rt)>|)OT;Zg4~LYE^xe++?gIKZUaQ8$>Im}oPHFb?U50SM z+6aA!#fs!{xoyXKE$SM(B729;Sc2=mBuQBN&5jLW-iGarNPKJb6hkL`%MP&L03%@j z>QPqJRRHSLYMJI0It+~R@-c@XrTt3gKQiR!mB(`ZSWvJ#Sqf+LtQ|wU7F&4T9il!l zw18}%i^4{a63~cS_HRCa)y;}o`cPaLj`Tlyc=OM0e%etwz~FF%%NX7mF6aT8Z{;B$ zs^S!a6Qix_%OFdQ?yiz-Osx-2Njb$KYY0fKJ<(?--=?yBW%_wx~P+oVj#^L>=z-nO~GdetK$q z@`|=rM?DG6=foQ)KBCn8;6lACEsdNV-7a|bn_@N0G=0sj9ZPQdLtxjVV zg;cNzA4z2%x{oc{64B?ya9vQCbl9*T?J3@0LZ^(1JrC8xfAgNvcmQxFx?rz{Y`2_| zkC#uHUhkGzWvP#K5*I<%**oijvd2GRxhb8Y5ipp^H@LK}>cER*W!;5o* ztxe;}?-O@bbD0SSg!ER%-Y6CV^lMlgBK3QT@=$noRt|iJq8HaoF2Sg%aBUJ_p+>fQM za^L%}IBGh1-C?b{tN}znGne#+P&_U2MjvixmpXc)PA;bGer$$^i^UA~bY-5e%kiR8 z!8%R=S34$Y;k+8hqwb178~(dB7aor=Ywk^s>iGx7vGWw*U)EQJuu-N~4K9r1x(fdqg}u&{A>I;p5C|+ za^j(MmQF6`)UPG--xsijD37CvJ}!}J(+ZR z4(m56{KxuQe{Nolb#3RgmjPZJ&~Do-15I39WB0B? zt%Tr$Pj@Y{K7OkO{m#*P$mM2Y$sWpww5TlvY1or$V4wO_AEcYh0*m}U{>sdFxra87 z2%lZdadviB z$U^^-T!d-U?|B`E$Zayv*^2BqaxCD+7z?Y^3<_0eL$hU|{&o}jTs@j7-FuVwEWDjM z&t*P17ZAu`gqbLh9HYI8I^^6tA_8!EVWkRHn83^BR@|1y1i!XRD5n-qxQWx5)UVCC zZZ?2=98jQEPg-=D^4&k3mZHB5(S5G-H7KT@oCwe&mR@2Q=`Dm6-_f+n+X*T`cN;$C zP2R^gnY30ICcx75wS#FsN%3Uhh=i;4A_8S>1Yh|ux=j&Yu?-*oam0gHiTN-SoPoTV zHU64ctc{jll7Ws-D4|T)@zKBB6G7R<3^E8^pR6T!F z1d*eI__7-LE%A!aM|Z@F0&}{bdGdOpZ)TV(Ep}-}y;aIA(`IVzeiHg^bqsjB@)sUa zaRRt{B%At{Yt-5$3dSFE@NwRCHZG{Vzl@$OHKDT|76ZrE9OOtg7rjFpi+%HMk>>J- zu29(CN%j&siDpw&Xs89)5q8vFtqJin9&if-cxhr1UDHd95iD%QRH*Bt*}@ww(}{`?a8q~ zMB_9@2is$rNa1b6N?7dZ(4J|8{k5wZcD(v7OmI%pI3aAA@sa#OotoGK;Ijv1O)P71wjNpejTGDFN9=LZjOiiuW z*-UgJU1mZI!&{20x+Oxl(M5qK@Kwka+%_)X_2pGx@!5i0pXZkfRSphD$8f~moix__ zkr9BJWE=)gou8dueQ_XdowyuVP;S!Zbh>_!xL!vWpHz~qx_HATxnXAIiF$<+0N^$_ zUTxTs2Apm@u^vI&#d>Q8w{J3I!k~{nG8lS787L=f$3Dt($Vcf8Aa;XZYtPYNll5oy mKHQHsiHonmuLLq-%%?^~oSDLZQ;>e6!T*i_Ed&%~oqqwk6BWMz literal 0 HcmV?d00001 diff --git a/kadai1/wataboru/imageconverter/ImageConverter.go b/kadai1/wataboru/imageconverter/ImageConverter.go new file mode 100644 index 0000000..bf4ccb2 --- /dev/null +++ b/kadai1/wataboru/imageconverter/ImageConverter.go @@ -0,0 +1,81 @@ +package imageconverter + +import ( + "fmt" + "image" + "image/gif" + "image/jpeg" + "image/png" + "os" + "path/filepath" + "strings" + + "golang.org/x/image/tiff" + + "golang.org/x/image/bmp" +) + +type Args struct { + Directory string + BeforeExtension string + AfterExtension string +} + +func convertImage(source, dest string) error { + sourceFile, err := os.Open(source) + if err != nil { + return fmt.Errorf("file could not be opened. target: %s", source) + } + defer sourceFile.Close() + + destFile, err := os.Create(dest) + if err != nil { + return fmt.Errorf("image file could not be created. target: %s", dest) + } + defer destFile.Close() + + img, _, err := image.Decode(sourceFile) + if err != nil { + return err + } + + switch strings.ToLower(filepath.Ext(dest)) { + case ".png": + return png.Encode(destFile, img) + case ".jpg", ".jpeg": + return jpeg.Encode(destFile, img, &jpeg.Options{Quality: jpeg.DefaultQuality}) + case ".gif": + return gif.Encode(destFile, img, &gif.Options{256, nil, nil}) + case ".bmp": + return bmp.Encode(destFile, img) + case ".tiff": + return tiff.Encode(destFile, img, nil) + default: + return fmt.Errorf("image file could not be created due to an unknown extension. target: %s", dest) + } + + return nil +} + +// 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) +// ディレクトリ以下は再帰的に処理する +// 変換前と変換後の画像形式を指定できる(オプション) +func Convert(args Args) error { + return filepath.Walk(args.Directory, func(path string, info os.FileInfo, err error) error { + if err != nil { + fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err) + return err + } + + ext := strings.ToLower(filepath.Ext(path)) + if "."+args.BeforeExtension != ext { + return nil + } + + return convertImage(path, replaceExt(info.Name(), "."+args.AfterExtension)) + }) +} + +func replaceExt(filePath, toExt string) string { + return filePath[:len(filePath)-len(filepath.Ext(filePath))] + toExt +} From 9e684513854fdff4b0ba21eae64df4a1c6670886 Mon Sep 17 00:00:00 2001 From: Wataru Sato Date: Sun, 5 Jul 2020 22:31:10 +0900 Subject: [PATCH 2/3] Add README.md --- kadai1/wataboru/README.md | 52 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 kadai1/wataboru/README.md diff --git a/kadai1/wataboru/README.md b/kadai1/wataboru/README.md new file mode 100644 index 0000000..5293a99 --- /dev/null +++ b/kadai1/wataboru/README.md @@ -0,0 +1,52 @@ +# 課題 1 【TRY】画像変換コマンドを作ろう + +## 次の仕様を満たすコマンドを作って下さい + +- ディレクトリを指定する +- 指定したディレクトリ以下の JPG ファイルを PNG に変換(デフォルト) +- ディレクトリ以下は再帰的に処理する +- 変換前と変換後の画像形式を指定できる(オプション) + +## 以下を満たすように開発してください + +- main パッケージと分離する +- 自作パッケージと標準パッケージと準標準パッケージのみ使う +- 準標準パッケージ:golang.org/x 以下のパッケージ +- ユーザ定義型を作ってみる +- GoDoc を生成してみる +- Go Modules を使ってみる + +### 動作手順 + +``` +$ go build -o imageconverter +$ ./imgconv -h +Usage of ./imgconv: + -a string + Input extension after conversion. (short) (default "png") + -after --after=jpg + Input extension after conversion. + ex) --after=jpg (default "png") + -b string + Input extension before conversion. (short) (default "jpg") + -before --before=png + Input extension before conversion. + ex) --before=png (default "jpg") + -d string + Input target Directory. (short) + -dir --dir=./convert_image + Input target Directory. + ex) --dir=./convert_image +$ ./imgconv -d ./image + or +$ ./imgconv -d ./image -b png -a gif + or +$ ./imgconv -d ./image -b jpeg -a tiff +``` + +### 感想等 + +- 前提として、@tenntennさんの公開されている[handsonプロジェクト](https://github.com/tenntenn/gohandson/tree/master/imgconv/ja)と似ている内容でして、以前やったことがありました。 + - そちらに無い部分として、tiff変換やbmp変換の追加などを行いました。 +- GoModulesを利用したく、`golang.org/x/image`を導入しました +- 様々なソースをみていると、変数名やコマンド名が自分は冗長かな?と感じています。Go話者の方は短く記載するものなのでしょうか。 From 350ed734329a4aaa7a12e64268960533570b2ea1 Mon Sep 17 00:00:00 2001 From: Wataru Sato Date: Wed, 8 Jul 2020 16:32:01 +0900 Subject: [PATCH 3/3] - Change example directory name "image" to "testdata" - Modify import statement in main.go. - Add error handling to defer of imageconverter.convertImage. --- kadai1/wataboru/.gitignore | 1 - kadai1/wataboru/README.md | 8 ++--- .../wataboru/commands/imageconverter/main.go | 8 ++--- kadai1/wataboru/go.mod | 2 +- kadai1/wataboru/go.sum | 3 ++ .../wataboru/imageconverter/ImageConverter.go | 29 ++++++++++-------- .../{image => testdata}/free-icon.jpg | Bin .../{image => testdata}/sub/free-icon.jpg | Bin 8 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 kadai1/wataboru/go.sum rename kadai1/wataboru/{image => testdata}/free-icon.jpg (100%) rename kadai1/wataboru/{image => testdata}/sub/free-icon.jpg (100%) diff --git a/kadai1/wataboru/.gitignore b/kadai1/wataboru/.gitignore index 43d90bc..090a1f0 100644 --- a/kadai1/wataboru/.gitignore +++ b/kadai1/wataboru/.gitignore @@ -1,3 +1,2 @@ .idea .DS_Store -go.sum \ No newline at end of file diff --git a/kadai1/wataboru/README.md b/kadai1/wataboru/README.md index 5293a99..012adcd 100644 --- a/kadai1/wataboru/README.md +++ b/kadai1/wataboru/README.md @@ -19,7 +19,7 @@ ### 動作手順 ``` -$ go build -o imageconverter +$ go build -o imgconv $ ./imgconv -h Usage of ./imgconv: -a string @@ -37,11 +37,11 @@ Usage of ./imgconv: -dir --dir=./convert_image Input target Directory. ex) --dir=./convert_image -$ ./imgconv -d ./image +$ ./imgconv -d ./testdate or -$ ./imgconv -d ./image -b png -a gif +$ ./imgconv -d ./testdate -b png -a gif or -$ ./imgconv -d ./image -b jpeg -a tiff +$ ./imgconv -d ./testdate -b jpeg -a tiff ``` ### 感想等 diff --git a/kadai1/wataboru/commands/imageconverter/main.go b/kadai1/wataboru/commands/imageconverter/main.go index 060d3a1..a60490c 100644 --- a/kadai1/wataboru/commands/imageconverter/main.go +++ b/kadai1/wataboru/commands/imageconverter/main.go @@ -1,7 +1,7 @@ package main import ( - "dojo8/kadai1/wataboru/imageconverter" + "github.com/gopherdojo/dojo8/kadai1/wataboru/imageconverter" "flag" "fmt" @@ -10,11 +10,11 @@ import ( const ( // ExitCodeSuccess is the exit code on success - ExitCodeSuccess int = iota + ExitCodeSuccess = 0 // ExitCodeError is the exit code when failed - ExitCodeError + ExitCodeError = 1 // ExitCodeError is the exit code when failed - ExitCodeInvalidDirectoryError + ExitCodeInvalidDirectoryError = 2 ) var ( diff --git a/kadai1/wataboru/go.mod b/kadai1/wataboru/go.mod index ea030c9..f6891db 100644 --- a/kadai1/wataboru/go.mod +++ b/kadai1/wataboru/go.mod @@ -1,4 +1,4 @@ -module dojo8/kadai1/wataboru +module github.com/gopherdojo/dojo8/kadai1/wataboru go 1.14 diff --git a/kadai1/wataboru/go.sum b/kadai1/wataboru/go.sum new file mode 100644 index 0000000..394251b --- /dev/null +++ b/kadai1/wataboru/go.sum @@ -0,0 +1,3 @@ +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/kadai1/wataboru/imageconverter/ImageConverter.go b/kadai1/wataboru/imageconverter/ImageConverter.go index bf4ccb2..9cb7132 100644 --- a/kadai1/wataboru/imageconverter/ImageConverter.go +++ b/kadai1/wataboru/imageconverter/ImageConverter.go @@ -10,9 +10,8 @@ import ( "path/filepath" "strings" - "golang.org/x/image/tiff" - "golang.org/x/image/bmp" + "golang.org/x/image/tiff" ) type Args struct { @@ -21,7 +20,7 @@ type Args struct { AfterExtension string } -func convertImage(source, dest string) error { +func convertImage(source, dest string) (err error) { sourceFile, err := os.Open(source) if err != nil { return fmt.Errorf("file could not be opened. target: %s", source) @@ -32,7 +31,12 @@ func convertImage(source, dest string) error { if err != nil { return fmt.Errorf("image file could not be created. target: %s", dest) } - defer destFile.Close() + + defer func(returnErr error) { + if returnErr == nil { + err = destFile.Close() + } + }(err) img, _, err := image.Decode(sourceFile) if err != nil { @@ -41,20 +45,20 @@ func convertImage(source, dest string) error { switch strings.ToLower(filepath.Ext(dest)) { case ".png": - return png.Encode(destFile, img) + err = png.Encode(destFile, img) case ".jpg", ".jpeg": - return jpeg.Encode(destFile, img, &jpeg.Options{Quality: jpeg.DefaultQuality}) + err = jpeg.Encode(destFile, img, &jpeg.Options{Quality: jpeg.DefaultQuality}) case ".gif": - return gif.Encode(destFile, img, &gif.Options{256, nil, nil}) + err = gif.Encode(destFile, img, &gif.Options{256, nil, nil}) case ".bmp": - return bmp.Encode(destFile, img) + err = bmp.Encode(destFile, img) case ".tiff": - return tiff.Encode(destFile, img, nil) + err = tiff.Encode(destFile, img, nil) default: - return fmt.Errorf("image file could not be created due to an unknown extension. target: %s", dest) + err = fmt.Errorf("image file could not be created due to an unknown extension. target: %s", dest) } - return nil + return err } // 指定したディレクトリ以下のJPGファイルをPNGに変換(デフォルト) @@ -63,8 +67,7 @@ func convertImage(source, dest string) error { func Convert(args Args) error { return filepath.Walk(args.Directory, func(path string, info os.FileInfo, err error) error { if err != nil { - fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err) - return err + return fmt.Errorf("prevent panic by handling failure accessing a path %q: %v\n", path, err) } ext := strings.ToLower(filepath.Ext(path)) diff --git a/kadai1/wataboru/image/free-icon.jpg b/kadai1/wataboru/testdata/free-icon.jpg similarity index 100% rename from kadai1/wataboru/image/free-icon.jpg rename to kadai1/wataboru/testdata/free-icon.jpg diff --git a/kadai1/wataboru/image/sub/free-icon.jpg b/kadai1/wataboru/testdata/sub/free-icon.jpg similarity index 100% rename from kadai1/wataboru/image/sub/free-icon.jpg rename to kadai1/wataboru/testdata/sub/free-icon.jpg