From e52116fb70ed4e9c7f09c3cf15399669349c6a99 Mon Sep 17 00:00:00 2001 From: gogster Date: Sun, 21 Oct 2012 07:14:57 -0700 Subject: [PATCH] First Commit --- build.xml | 74 ++ build/classes/.netbeans_automatic_build | 0 build/classes/Effects/AutoBrighten.class | Bin 0 -> 1464 bytes build/classes/Effects/AutoColor.class | Bin 0 -> 1813 bytes build/classes/Effects/AutoContrast.class | Bin 0 -> 2095 bytes build/classes/Effects/BlueAdjust.class | Bin 0 -> 820 bytes build/classes/Effects/Brighten.class | Bin 0 -> 906 bytes build/classes/Effects/Contrast.class | Bin 0 -> 1000 bytes build/classes/Effects/ConvoEffect.class | Bin 0 -> 2104 bytes build/classes/Effects/DustFilter.class | Bin 0 -> 1834 bytes build/classes/Effects/Effects.class | Bin 0 -> 259 bytes build/classes/Effects/Granulate.class | Bin 0 -> 943 bytes build/classes/Effects/GreenAdjust.class | Bin 0 -> 817 bytes build/classes/Effects/GreyScale.class | Bin 0 -> 843 bytes build/classes/Effects/Hue.class | Bin 0 -> 1053 bytes build/classes/Effects/Invert.class | Bin 0 -> 821 bytes build/classes/Effects/Posterize.class | Bin 0 -> 834 bytes build/classes/Effects/RedAdjust.class | Bin 0 -> 811 bytes build/classes/Effects/Saturation.class | Bin 0 -> 1074 bytes build/classes/Effects/Sharpen.class | Bin 0 -> 1474 bytes build/classes/Effects/Treshold.class | Bin 0 -> 950 bytes manifest.mf | 3 + nbproject/build-impl.xml | 642 ++++++++++ nbproject/genfiles.properties | 8 + nbproject/private/private.properties | 3 + nbproject/private/private.xml | 4 + nbproject/project.properties | 61 + nbproject/project.xml | 16 + output.jpg | Bin 0 -> 72130 bytes src/Effects/AutoBrighten.java | 60 + src/Effects/AutoColor.java | 75 ++ src/Effects/AutoContrast.java | 83 ++ src/Effects/BlueAdjust.java | 45 + src/Effects/Brighten.java | 61 + src/Effects/Contrast.java | 56 + src/Effects/ConvoEffect.java | 91 ++ src/Effects/DustFilter.java | 85 ++ src/Effects/Effects.java | 19 + src/Effects/Granulate.java | 38 + src/Effects/GreenAdjust.java | 44 + src/Effects/GreyScale.java | 34 + src/Effects/Hue.java | 65 + src/Effects/Invert.java | 38 + src/Effects/Posterize.java | 36 + src/Effects/RedAdjust.java | 44 + src/Effects/Saturation.java | 61 + src/Effects/Treshold.java | 44 + src/imageapplication/ExampleFileFilter.java | 222 ++++ src/imageapplication/ImageViewer.java | 87 ++ src/imageapplication/Main.java | 22 + src/imageapplication/MainFrame.form | 699 +++++++++++ src/imageapplication/MainFrame.java | 1184 +++++++++++++++++++ src/imageapplication/about.form | 80 ++ src/imageapplication/about.java | 86 ++ src/imageapplication/h1.form | 165 +++ src/imageapplication/h1.java | 153 +++ 56 files changed, 4488 insertions(+) create mode 100644 build.xml create mode 100644 build/classes/.netbeans_automatic_build create mode 100644 build/classes/Effects/AutoBrighten.class create mode 100644 build/classes/Effects/AutoColor.class create mode 100644 build/classes/Effects/AutoContrast.class create mode 100644 build/classes/Effects/BlueAdjust.class create mode 100644 build/classes/Effects/Brighten.class create mode 100644 build/classes/Effects/Contrast.class create mode 100644 build/classes/Effects/ConvoEffect.class create mode 100644 build/classes/Effects/DustFilter.class create mode 100644 build/classes/Effects/Effects.class create mode 100644 build/classes/Effects/Granulate.class create mode 100644 build/classes/Effects/GreenAdjust.class create mode 100644 build/classes/Effects/GreyScale.class create mode 100644 build/classes/Effects/Hue.class create mode 100644 build/classes/Effects/Invert.class create mode 100644 build/classes/Effects/Posterize.class create mode 100644 build/classes/Effects/RedAdjust.class create mode 100644 build/classes/Effects/Saturation.class create mode 100644 build/classes/Effects/Sharpen.class create mode 100644 build/classes/Effects/Treshold.class create mode 100644 manifest.mf create mode 100644 nbproject/build-impl.xml create mode 100644 nbproject/genfiles.properties create mode 100644 nbproject/private/private.properties create mode 100644 nbproject/private/private.xml create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 output.jpg create mode 100644 src/Effects/AutoBrighten.java create mode 100644 src/Effects/AutoColor.java create mode 100644 src/Effects/AutoContrast.java create mode 100644 src/Effects/BlueAdjust.java create mode 100644 src/Effects/Brighten.java create mode 100644 src/Effects/Contrast.java create mode 100644 src/Effects/ConvoEffect.java create mode 100644 src/Effects/DustFilter.java create mode 100644 src/Effects/Effects.java create mode 100644 src/Effects/Granulate.java create mode 100644 src/Effects/GreenAdjust.java create mode 100644 src/Effects/GreyScale.java create mode 100644 src/Effects/Hue.java create mode 100644 src/Effects/Invert.java create mode 100644 src/Effects/Posterize.java create mode 100644 src/Effects/RedAdjust.java create mode 100644 src/Effects/Saturation.java create mode 100644 src/Effects/Treshold.java create mode 100644 src/imageapplication/ExampleFileFilter.java create mode 100644 src/imageapplication/ImageViewer.java create mode 100644 src/imageapplication/Main.java create mode 100644 src/imageapplication/MainFrame.form create mode 100644 src/imageapplication/MainFrame.java create mode 100644 src/imageapplication/about.form create mode 100644 src/imageapplication/about.java create mode 100644 src/imageapplication/h1.form create mode 100644 src/imageapplication/h1.java diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..20c8112 --- /dev/null +++ b/build.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + Builds, tests, and runs the project ImageApplication. + + + diff --git a/build/classes/.netbeans_automatic_build b/build/classes/.netbeans_automatic_build new file mode 100644 index 0000000..e69de29 diff --git a/build/classes/Effects/AutoBrighten.class b/build/classes/Effects/AutoBrighten.class new file mode 100644 index 0000000000000000000000000000000000000000..65de62bcd5980b8590dd033f4d09729e4ac1d944 GIT binary patch literal 1464 zcmZuwO>Y}j6g|%~V|&Ii*MvYpmxiaUHYsme#eQfMkb-IRsL_Qaktv8}P) zrYxc?x@5(I1?s9rV$)5frj@FyJ0ye<`2%daWX-F_ z?H+Syf_^Yw6VS?)O9J{wgAS{Yt_OYp!ep!EM_+lZkeS)_LE8&2c~Kzmr%8R>3q}IR z)<4Z?4gS=#A-N;J!|HD2 z`>fPk;Y2D9*f0#X{g4!i%hYdN3p!(|x#vp?0do`v9Y4A%-$@%ywpc7idUGNUji)M0xVi>wHdbTAOzt zvrf>@Rv$oAbNFEoiK;!f2kkDi3FK&x5Do0msWeAF%e!pcg%>c#JBjE_5nJq%^@aZ- zR`U|P@Eq*i6g#J|OL6}cn@BiDezs z&!g}o7IB-^cku=u;Z6KX{|Cxy#CN#J3f?0^hR39i8gVlGpJjc4K10MPPLL($PXi4H~wb7LA2}KS6(i0RRvt(nhbVay}%Lc&DElEYmTlw z(|r6BQnagun=rK1;$dQ~C=)DInKZ4dJNiu|HCLZa7HoTaw`ixgcO8BAO#TkZ^hc+BEQ(7T0w$UU9|#@ Pculne`NbYrtS9~ffnDzO literal 0 HcmV?d00001 diff --git a/build/classes/Effects/AutoColor.class b/build/classes/Effects/AutoColor.class new file mode 100644 index 0000000000000000000000000000000000000000..c9ad54bef2fc4ad3a8c8f3cbb2b33b73557f065a GIT binary patch literal 1813 zcmZuxT~8xr6n@^$v@>mob_zQv(&`ER`Re(4&N=Tq{^#f4 z0KA5!7!24^#4#qx>ynI1G7-fMOvW&U=@`|U>g*#xIbo27TN-9G%nImkt>ig{h9e-B z1k_U9^C&I^;#RMJXh+cMzvXX8v-56^LOqzrDh{P(`we|>Xo{8gQ*6VWJXb7kp;KXbl8eM zaC?b=zTM?-JFM$Dn*!l2&v9xDDpp#o7TIz4oC;HiZWBlNLwB<&do4TeR=Ft%8fJq{T76El&uKSSy?V)MG*)FDdb3wq$S*4pTdTLc zlEbdqOX3_hbQl9yX#7d?~`tk%o_B>!9NuaDfs z65cwE_!6UmB+@*VAPZ08>~JVuVSXXcgdHd4Sy39G#3QCONJ&Ll3=>0=2c?TVkt7j8 zTwEibBtO0hF^E?w>99l(`|3v&Y0*uT{d@qu;u5j;^Z14Q90bS7UlnEp?(<%{?;vC9dk2yw|F5x?r_ EzpGL*w*UYD literal 0 HcmV?d00001 diff --git a/build/classes/Effects/AutoContrast.class b/build/classes/Effects/AutoContrast.class new file mode 100644 index 0000000000000000000000000000000000000000..4efbd3ed6eca84e73d469c7bed22a11d07b91693 GIT binary patch literal 2095 zcmZuyOK%fb6#lMf#$%7ij|7H5ZKt6x5(k`?(&6m@AwW<{kZ6%Asy1WK5D%Jo-0>t0 zT_6_h`V&ews1h5bs!}0RU#z;R)Ll3I1>Li*px>QwNTedi=bU@)x!-rrJ?A=qJpbu8 z0Po?l0TZY5D4-?9tU+-`inCIjQ(iDi$6OBQ4dgJd95PMwYCU0;n#q0B6qYDGF0zBz_11}<8Y^1{X*E_Bb0^W+(wW#;4FV6EQ|qu6to`d;M3e%PDe=y-i;uv1sUc;aQm#BDEb zN^qvK`&DfcsBA+owQsSH?EhBePzzX-i`!w>;>hovdD5Y(fMO^C(_?mkAQQ91k=$`ABru$!_3C6OxeM!2%LlIT2zJs6{wh`Hd*oPtC=R>}7^&8}>ryoMk zRJ*5Zj~Ko){oTkDyhu=)euIQr($o_;P^N`QYneAhe?Dvq&;W?G(twy!xZbEHT z>ry>{R(n+6rZh+m=DLe{Zqf13OA?D6N-MI470KN<=u=4aCf-WvG69pU@OsA;TT|?; zV(TLUzZfTSsmiCyQ0#(LsMWgJ9kd>;d1)I=Z+q6tBm2Sli?4n|qtWr|n*tAt@ z@Y}SCPmo=@S7N&VY)@*NQwTOI&$}GwJx=i^XYe*o;2q5406xSdy7c!r0JkxXuW=CH z;t;;)`Z3uemKtt+}?!M!Q_o{~dJ7R{cIS zg`0^dN68rVJ~+UP-F9l0mN>Ohykxv5r~3r!#yn=h)jh zcJ@5)>jF;VBCg^RJS<=xmy`aq(%iRh78~qQ`rbB@S~Elolb$KW^pc*bME)%4nU>td t*6&M;Hz8lM@iTItjOI6CJmo6=Y01iN;Yz}}Cyjc^X$(09GnDbC{sU{NMZy38 literal 0 HcmV?d00001 diff --git a/build/classes/Effects/BlueAdjust.class b/build/classes/Effects/BlueAdjust.class new file mode 100644 index 0000000000000000000000000000000000000000..2662d752390374cbeef74b8bd75ae81c997251d1 GIT binary patch literal 820 zcmZWnO>YuW6g`ib;Y+krWLhm?rNtI7DVj9x!b<#z8WLigXu9df0bXIq2xexeqzl5r zAK(vgWlY?-G4UgDp?m*{e?mNOK)Y}zbKkl5-Fxo2H}muNx9IzJ()SNk1=W@6WmOUqP_if6^g5oDeO@-h zp^{GqL$4*-Tg`DMXsc(R*eN7&E`>M}DO|=1$NFEnfT>ceuHElc_nSQqMxwuY^AiOw zHVVPDat=kv6>G%gr%lnT@)SIc%2$Yw1QDF4RYkxBzF=CIfCZTJ1QwB|RmHDEdZ1Xb z^v{TBJBDTC^4+(vu3JWh-_{ps`>zb~e){W-dx=#*hCP4 z;=HRu8Cao`BJ&f}sbb4ST8J(Y>AdH{=IVa%Msd^^G0mFh>G*aC;-}-90^=Rs(kq`3 zd8Pm(?+~X|&KpFv9X+k*Omj5JoAJ@a(kFY_4lp*MH!D6Q7hb@3Hdin9a+}$FTx$-mn+c;uSS57&RJ68rxLU2m4?LIE86OXa?HSJ`f)K z06(Bl#>5w2OuQsM_yPWjKVe;GXlo(~d+)RMZS6I`{`~j};09)62xHQOfvFhHw02B5 zf^-CzBbX5|_8f0l3W%aWc*(81t%86yH@_~RKW0fs1^7-zYlJs9XC6CD9a--~c z>yGcL_X()CYHm~Io@{N&a;uqrA4l@lc7L-)o+w#v$?7|$Zf7TuUdiuB<#xyUsYeqI+LZ~q}Yqb zu3whiP0oF%bQZRqJtvMB&czXh8OJEb1g!sA6H^k8Mcv3)!xItVjCI$7rsGTd25J|$G`v0A7U3^liV<8jUYuojYP1kK-9z-F3_r~ z^vPBgU1X19&4^u$I#Y^`vFByD2N$?%H~H zDe;NRdy=k^JaCB=$0^p(_zZv5sOKsLoN zp&gKp<8mC6apVMy4aZxT0%A_UoN=3OSQgN7`6U5;)~_+sJ?}QG89Z<*9+}L% zUv<1CCvesIh}6S|+g7>TtE;jawu`fVGYp(|c$30+TrZS?Kq9v?$B$AMF8P+bB|Ub< zR(QR!>DIyq*@krMjZh%j_S~8bIH5p#G4QLh-Ck53oGmw(S1pkMkM%%4ro7W?1-?_I zh!)5i^Wb}1oR3)e37G1{!POmu|P8unkNh5(|8vPg$u>RkJlqxKGPP1NI zsH|~GnsZ!r^u#DlHX&#+w^DMnTO+1AW16QTpMp=L@Dt)IK@44tstH7A8PlBtbi?9F zpa&U7)%+@w2eJiQ|BjeeGHhdLxbY75lx-CFo&EuBVb>5J5B{EN_p%GrGO47rh8f3U zM|YLUCNY3>jH)VobgM$=S)-=PqLv|Tc7-PVU{!wswEJuK@*rsisoLI>gDl)QA z--D^ChEtNg5y`$&k`fVVX4qp{TRXO4B^b?}nZYj{xbq5@xhBxZ75cgO07fu~Jce+U zhLv#<^JJF!hAS9Dou+u0fR9ORB8R6a;5nwSiz|46X}o6F8~*>^;yOO#Mr8HfjyWd= s?^8cX>vVkLEz00HKJYGO@CaV=MrClGnj=I86`$b}k@~5OMpKU+0@G!uSO5S3 literal 0 HcmV?d00001 diff --git a/build/classes/Effects/ConvoEffect.class b/build/classes/Effects/ConvoEffect.class new file mode 100644 index 0000000000000000000000000000000000000000..236b1b21c0b29fc713beeadc07e7f3ade92d73e3 GIT binary patch literal 2104 zcmah~QBxaL6#g#R?1m5^F47h#v?wYhZKG7N5Q-@fAZ^+Zq0p47-6Tu0G$gnrFyl)d zU!C#6KKbUGuR0?zTBm(<#$Vx#Kf{@h-`x!mQfeo2@1A?^J?DJiJ>O>kdhz=+03YCy zAN`p0;kqAF_(XaBHK4?P1X^((F&}Oy*Z=u$+=po&W|SB=eVFwjuEhQZG|Xw3_ale} zKRS_+AvgWFg`}KrYq;ab8Kk6pQCev~KE+ZSmT_0ZiiTAIZ??8>Z3+w|H;f%4V(eBU z)}~P~Bh$6@b<;NU3Au_2sEWx87I_Sbvq(KRon&Zwx+gB+o)QVvdrYrYphIQb5^Np+5)jUFv;HK+sw-Grn1|n zy<^(Zk>l;d>+xFho&R@TfQQwy{;T za@(V`By`782#07JMZpe+>*d&?|q$OLd7YXMxuAn$IvR3md`y0*zK zD)GDouf{jCm2Fsq6-2z*`%Zs%qG9 zwMKsCmo=j#CDW)xH!M1GpO-b9NUY7t=-viNxa3`ej$k{EcsN}Y@D!|**n_2U=v0DdpwE>0WiY5}r zDzcn6ya^ZS4;* zld9sg1%h&Uhx5B!T;QJ~&x$9Z1BkHRvJcM>mMY_E=Ti$Xl%rl*mX}DJ*ymy0|2pIhcolLy4(kCIdA+ve)kIy!AD5RFmrnH?VZHrz zy!DQujaN_)Jw<2cDS{bQ4gCuB0B;;X-$U0gPP5+Qd=on7UMT28JKHZ zFcE1aCO-B-V^U)cG!mme*c6*+qQ*yGeD=vF|Bd4B&hinXo6I@C`@83yd+s^s?(dI& z{29O*%*Bwza1_lLk>Y|B7o~Vbic3=&z9?bQuWJrO`t6|zPM-={aW8xz2;xG9pCZ>8F9reF=F>b4^LOBE-jTxeT8Q> zOa%1qYZLs*gGG^Fm0yJ)Z4}R_EOmwh}ImtWO+C94#|q^tw^Bft5wg<7ip-}WGd>SlV>H2Y0oWMwc4}{$zVZf zf!K^&_lg$Nl{GoKT<>!JX5PRPIBuX7DFba%m{J^*;xQ>6m!cCVG)x(o#+w@6GBAT# zfiCIZ=j1C(eOD{BdbR3$zEzs4T3+6_-OBiC(W*+os!zIp=b=UCn&tP(W3O`Oza#;@*lwMsW-f5I-M(qhuJ|*)XXRJe$JGDO0$NoXIkGwI zFgs{=H~fQp(b=vn4ff381Sd5Kffhs%lGWm*hGfA4&6)+8WeYSb7ibobTBRS0Oxey= zAGM$kXC6X)ADE>nBLQikgV<;o;7L3c?6dr2r1LvGRH1HezXQE}cn4ajy*!-$HZYT6 z62W#GqU>XwZIt0M%pgMkB(n)g=l#GEJxxx~GPJ)d@C=@99H!_9^Ue_WTdv#?~(1i~;DYtP7+jt(kIE~-67Q z1~4dwFeJt?EONLYW^qxxjZ4D8sJMkO@hQf|H|XGS=YskBl{0o76`qpfeBMBrXQi0Y zJU(JRDNf%N+(8eKAqKF@EF>C&%Urn2a~7GA^gSs)#tTF-bc+wsOVor`ahGo@#fj&n z9!xgTX=cxNM%2$;&OOlp5uXpyi$p5I;yYF&#W|0PuaPB+@Z_)XGLeR6v5m7tI^&!> ue1ap4AYW1JCm8ds@rOwK!c~aXJ$S@Z!L5%qtPV0_&gU6RzWu?#e&`=aJw~$t literal 0 HcmV?d00001 diff --git a/build/classes/Effects/Effects.class b/build/classes/Effects/Effects.class new file mode 100644 index 0000000000000000000000000000000000000000..3bc5d70084d55184b58f3005f35634e8dd429ec5 GIT binary patch literal 259 zcmXYsO>V+K427RVNcb(V<^r%u)I$_08;Dei4XYuTWYCbHnE`sXE;v9BRn@673)}C_ z_hk9!_xlCl9g7&V7;{3j(Z;hS3|5Cs-g-}1HnvP^_D5E=OLAq^m4(?#bCS5}FE%pt zpZer0F)G$&U5JjP-+G?VW0fP(WD=Cx&B`Pi$II8=|3@d93ttGS23MU)3?L(85j%d zc1xhYv{0?eO3*4S`KH@;%s|eOdC_(P=?f$>TPyrRdL?Ky1;iq=4b$I~77r`@ZT`Ci zoA!Zp$k??-RDESzL7iw_+O>KhkZd`&CH;NVq0q2jAhqs$71?U7hmAxtE7`C!;t|j{ zytZGF6v7F*&&B0;&3!Y4Byby6%(&zkPo>E0)7A4Akf?4E${5oB%1rD>};pBPSL6vjZ7acuMxeQrn5zU|iLvYWVyIA50r^Qjf?9Ej@$o(kLrcXj3%;v<7Dq`1Z-up1W{r%nsdjUJvT z6n$LTEJmP`2&j#Y)xYYqno>*{iC*gio+-tokqo2dPv~Oy&EC8F>X7=j7$4S*cs}+X zga0OuPJV{DSUG3Jb4FscZX~z!<-?>nIypW}a6RhCD@MZ7oT;B;1~7s_OkoH)T*6&k z#zP`Y7{e;Y@q+nn)>SbPbyX>O3bRNPQ`vEkd4mHFphOlU^5!MEjL5Cp+1MPC+{2L- zHQr#*s1O@rq(spuqZk!!^WNde?QvW=H45{r3G4MQP@bn_$56lX^taWMk+#9ps`EQ_ NYBtCr_<~{mwcjkWt|I^d literal 0 HcmV?d00001 diff --git a/build/classes/Effects/GreenAdjust.class b/build/classes/Effects/GreenAdjust.class new file mode 100644 index 0000000000000000000000000000000000000000..a330919d22c9b1d541238a47594acc0de81b69d6 GIT binary patch literal 817 zcmZuvO>YuW6g`ibDIcPp(oU-dY_V8inv^s#U1%j~h#C@Nn`pY}#sOYo$OvW_D(Ql- z@CWzz>NgW zmNsQNihL9|qu3TO&K++k1w>6?;lS;=K}A3-mQDopYQM#s#k$**4~I`1(tqqUJZ4h$ ze$(+z9N$&(JgEmAcOYQZ@132=W-ur}@TKe>wz|VXaEI9UT`!QnK&*ILIs3B3sI8{* zvJq~Tc+?;IP087$ZT`b(x9glcNhEM7i5TKZT*JD+@_)FqPt}$^r`IkYHM-o5n*1)D zpU6?$1qdq3O%x(k*64EpZIV%$r{HPWpCR7UiQqD=Y67nC1PffX{zvp!CqDz`>Y3%#rKbly|3IlC{sQ5e-FOw*=$F}@o*v5Rp?;^rC8cLfb2Q1CvC+iRCkN?wgqaCrQ#+7y9M>ts2FK;FN%{qn v*}*pTEb#X(;ShGX(5)GTKWkKxW-tFB+(w2rLX^D_Pa~F1)Y%#v;l#~frk#Zb literal 0 HcmV?d00001 diff --git a/build/classes/Effects/GreyScale.class b/build/classes/Effects/GreyScale.class new file mode 100644 index 0000000000000000000000000000000000000000..a0f291abe6217c6674fd66353da9066a4e0550d2 GIT binary patch literal 843 zcmZWl$#N1=6g`g~7{sIjTMa`rgAq_eX;~~JvauYfqLNg_$|f5cc!7>BSj}L}g32Oa zl7(*ESmjW<@B{n-zrmjn&+A}Z2-WwVJDqp#{qg(TcK~-$h{4246b4pfG&i&<(_yTI zaWjm(fH8KwkrWU$0dvFcxx=b}mM`oI=#TnsR_5z&Pi~H0Hl_dEX?n~g>;0DF?K-}z z;#pE3cHMzMs{VL?U$%yW(oU8LV^vAR0#+8G*!q8wgmcv*bCwPHC%o!2Niazil&* zCEnMB;B~o+;^UAlY?kVhBwprx2{u$cVi7DPqf1Mb#KmR?s7*JVM zmcSK0v5XYf>F+asfXjiDXY5JypW-GaGq-Vx$WRhy@)WY!tt3~-6Xik*T_w^2v_Pb@ z&cn{uc*}~(S~-Df#(lYB&YKY+?e_-$LF7Jy8d}Y+Wpy;8MMo2K9U+9hNaz^Gh>r6Z z6=?d0gFrwQBrP_2Y?me9n^&it^31{%$wWzfDIJq= zeDpYF#z;1rPN!oT^zb$LL8M$B35jn=p-zO9t+W!{1$Qm}1>yr04+4}8uCo(aEUpW<~0!@(i3{o`f1!hZ*S{F5yagO{Dow!{`x7UV) zu0UXOYtmJGn_DTVY$erD*igkj)N!ptQ}`c_e}w00P%GtbNUK9rxwPSZUf=)sU}P6w z%E{0UG-Wb;UAaLxI4?b~xbM*f!MdiLUo#aX9XwJai(RBB4iu2=r!W*6}ryFE`w>#YqydVlW-CjJ#8A^?r5f|^--~0`* A8~^|S literal 0 HcmV?d00001 diff --git a/build/classes/Effects/Invert.class b/build/classes/Effects/Invert.class new file mode 100644 index 0000000000000000000000000000000000000000..467d37483580c1c98b1bbccad06702afa0bcdd19 GIT binary patch literal 821 zcmY*W&1w@-7(F*L)1+x^C!?cnGt)m6(uxU!WMeZMQ3w=UP`W8yOft90lxZT9X$)PI zF2twkN(47<+$gy40elm8K7sYzn^-Y0-~V^+IbVMK{`MWfBit*(!fFvF){HAw@>tJf zBagcRGuv@L&H@3Wy16f4J{?3-U|}cj%NM67ZJE9b+X*Yq&Y%+}`(YZZd|EWKUOW`A zcb**`$xb$`xB4TQW={zFJWev13KXgbE&dd?i21eHdmWEu!oA!9GwV$pWj$7VGVb;= zf!SdaM=~9Si9l&D9dzVyxTiMAuG-pED;j{5QyDSqrc(CVY$vBAT6{S;O*@kBGntzZ zsvU=;uteE~67FD8VE%u?l%OW+N!ah!ciYF*!W;aZnR=}Aeiq1-7c}SzM?1@`PA}-K zt*;QD8RSr;ozca4%rP!a2Iy}vBLghZs^xbCRgf!2!*VUp@4binz_qsc)xIFN`_>X4 zuYUeRbw~qnhhJk6BT zFLo5hsEn(MZJ(Vtbx=4v4^(j8Fv|j7)TH&JfYvpmhUu~Q0eRY{cL~dA`qzcPSB1be zb)`VtFkSN!Ge*O749~X57rtE>U%2MQcI6Xao?Nh|l`Zm4OVqGTTfr(k+^6b?R1+}U q#Tp|1IT<$e^y3NhYxN^;m9?%DA}I9^=PO$M5)O$rQSa+lSN;Gd$A&Wi literal 0 HcmV?d00001 diff --git a/build/classes/Effects/Posterize.class b/build/classes/Effects/Posterize.class new file mode 100644 index 0000000000000000000000000000000000000000..82a91083b80f0ba2fb648afdb2199299b5bfc958 GIT binary patch literal 834 zcmZWnO>YuW6g`ib0gBiT)Uh8h^g|PAO&}(QjfEJECM3j?)O6F;0Ix932z6$tgau(? z{1sgp6E|+$XyU>j;6HKiT0Cz+TsV_?_uljFJ@?!TKYoAv4&VXqreI(v1s%KEj7S1| z3G63uM<9OW_T8{1pcM~J1@xzbjucpHxPAFz_^KuSmrlzgl5Gsyj(6(#u8J3+9`@Wo zV7>9|{9Lxfpxhh;q4eFcd_?BwuE#(iSv;%rQS`#)SLfZOJCYttV`q$vH*P2F5$#F0 z+Y1F&0?+M8|H|J({M-AnVO|rx^jr~{sR&`tNCjfTGd_x zHCqA9jgTbI3d^n$*D88e%bVtCYMaT?)Y7L%xlimq-(o46ZiBnpAc~u%oVpKOiiOqW}N^ literal 0 HcmV?d00001 diff --git a/build/classes/Effects/RedAdjust.class b/build/classes/Effects/RedAdjust.class new file mode 100644 index 0000000000000000000000000000000000000000..b620d7f84fdb484a5580228fbd2a800fd1903589 GIT binary patch literal 811 zcmZWnO>YuW6g`ib;Y)0%w6t2NEfxz*laeN;3oRrK(S(H9Mol-}IKV3m8Nm!gC0!5} z{s4b~D`Voujfo%8g+IW5;-3)D8?Y{%$=rAEefOSw?#cZ8{rv}kedOZ^BO8N(+i{w0 zZOU{6xd`q=up?kx*zQmYh?+q7(CImTML;VQPX+X9zr~xyy3>=7hR++)dulgaW|H-O z({@j7&r$I_srwygAh2A2aDFbE{-E?&wvJle;lRI7a z+d^lYZ@hF`euvqPblM$XAU1HFmh?zbAaUaLn{qHXQ5_^#s1;R906@l`Y%ywkQucV+ z2zH7;=?}f87EW ztEzJIsmfbHDqxaheT+O+ZjGK6csJ#Zc&C!j>}?;^z$UM uiyi8j=Z{^)5v*XLyE6(`YgCbDFaI9gLxwg)l>GotBbG(f*&3U{#H~M&gkZ3Zc106DU%ybG!B9dry zqlqRiabpN>+?eQWI%e z;x`~=*DP|k=$dAk!GbSJDOC!xbzY!$#;LmVCTU1XhunIXjAbK&qo|AE2qF!H_sI1G{MtLziRal~6cKw^TzY5g(Nydto9d~R;s=sx0%yX{Ij8R&O zW0=dQCAknip2HZWr}FuHdIG0;cVUn>pMYe>Yg33xl(wF`ELXu*%Y23SNDx4jw#IkX zp@BHEmw*_KamUMnPAiLFL1QM+p3&9M2q=S^t|gMCchI|aEyJhx3zVs+ns~qa>#%nt ztH2&LXkz~pNOEmMi+@&*-Y}Zc$Wvuj`~ImCH8EFGZAYBZfRCDq6d$z^sf=^-d+fxW zeRkUo*lmeM*VadU5L#Q$Nw7YsCX%`;cAySvaZTmFFY^h3XECi@xEa@!KIw^TTHg-e z>Hqg&WD7ys(ZnV+Wi)x<$R(vCr>njvL_4VJ>LzNGK{XakM5C)4$!KVGLsvIOT0T(4 z-t6yDDR7c=I7RiXRC|W=X~O`OUq%P6qZ6~}!d;|LZBr6a6n-u&yRfc`n3+bVW(8=HT9#sFzLO-8jt<$E1+K6Tg0rmpwV%>YsF~C$ zoBG}l=;t(@yNmLo)0Z>n?Vj`8=bU?g|NZ_Gz!=`D2w+tD^%0QfJ^?;-Agbaq#)KGG zFrh-h6XAX;v`H1u@La)^f@u}4h^f#p(}EY6Rq#^5oPt*jp3LE{vCq(#*wc^nsD5lk zjeR}Oqw|NmyWHftxUgajN~NHi2fW1K+F53hXN;0z%`&({;VlMfp`7Ck?FpmA*AMqI z+}zYNMe+m^<*Z)Z(oI9yRi|VXj0!_XVu^ZWtx9ymsZDLCKjiIOM)Izy*R4yLzBl4ym@YIJKPS`&Dmk9aSCDL-bd-H zRr=*nJRTP-*OoQ8Zt)BD8M;GtJ8P*mv392{k+|F@z6SPB)~)nvpa{>u!Bb{TK%5M+kss0~dWH zv>qfOmW!l|{IqK%d&$bfLmDs@IRlIMeLv*1yCs#D0TOA#K>A{ryiHQAHj}7PkZjEjXI4mgQi_~IN#E&` zq%(L=;EQ~P?-c5^r^hqwc8{E*W&0dj`W&rkS*9SRwVk1TTJ8~+k9~vRjl}S0s_TNl zGYBuqAY?+&O5KA*%YE`jagUzX5Z;j`aIQL7syGQ1xWV+y`(|ofSMJ YO(Hvr5W+;?650{LFl8}}*xeuf1MCN1?f?J) literal 0 HcmV?d00001 diff --git a/build/classes/Effects/Treshold.class b/build/classes/Effects/Treshold.class new file mode 100644 index 0000000000000000000000000000000000000000..e4d7a3b65859a898056581cd36fb0e9222fba93f GIT binary patch literal 950 zcmZ8fy-yQy7=Etz(Q*{ImY#^TC@Ro`p&=%>NK1^dN&-Rx!2y?Rd$b2{;-ZN$4vwz=1-SVKxG;#%?+TcB$-Uq2^FHr;_x;c3uK*@+T}LNIbm&NH zQ$KD5k2dx5@b3G>)}c1_CH?!`i-#Hcn8jga!Wa!>OoBG)*4$=Zf}GAQNl3|{6)LyF%qAtmuzpz_Fdth1eIphZHU~Rl@+JdY-AUGr%|nY<(mX9xL(uo zB}CH8(|iQFO^CZr|twP@}e>|0V%ubWvL}UqBD77FM zMT~Z|U4S@x=t)Sxq!i81p|TPfkS*0zld0+(m}90o%6I%DLUYel>EQU+Kh!uBR(F$% zfnMqqF~x*DQDj`ic}7)%cQQ*@7tj~XA7H+h>_n`emK<0~S_<<#PMecdAXb>U{TPn> z4P$FN7Z{PP?YuCyEhPatxwDpln%Y?_B@i|h>Rn5Xp=D{NYHF|16T=bvjx2>De}FDS z&l!5&&@ClNl(z^|=8}6*TIXgrW_nSZ+S81u7xk}{T;QJ2+42S;$5LTu3 literal 0 HcmV?d00001 diff --git a/manifest.mf b/manifest.mf new file mode 100644 index 0000000..328e8e5 --- /dev/null +++ b/manifest.mf @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +X-COMMENT: Main-Class will be added automatically by build + diff --git a/nbproject/build-impl.xml b/nbproject/build-impl.xml new file mode 100644 index 0000000..2f1c40f --- /dev/null +++ b/nbproject/build-impl.xml @@ -0,0 +1,642 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..fb9cb67 --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=27f586d4 +build.xml.script.CRC32=a3b48cdc +build.xml.stylesheet.CRC32=958a1d3e +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=27f586d4 +nbproject/build-impl.xml.script.CRC32=db6c7ed3 +nbproject/build-impl.xml.stylesheet.CRC32=e55b27f5 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties new file mode 100644 index 0000000..0079df4 --- /dev/null +++ b/nbproject/private/private.properties @@ -0,0 +1,3 @@ +compile.on.save=true +jaxws.endorsed.dir=C:\\Program Files\\NetBeans 6.5\\java2\\modules\\ext\\jaxws21\\api:C:\\Program Files\\NetBeans 6.5\\ide10\\modules\\ext\\jaxb\\api +user.properties.file=C:\\Users\\Govind\\.netbeans\\6.5\\build.properties diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml new file mode 100644 index 0000000..c1f155a --- /dev/null +++ b/nbproject/private/private.xml @@ -0,0 +1,4 @@ + + + + diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..5959d39 --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,61 @@ +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/ImageApplication.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.source=1.5 +javac.target=1.5 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir}:\ + ${libs.junit.classpath}:\ + ${libs.junit_4.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=imageapplication.Main +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..681c32d --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,16 @@ + + + org.netbeans.modules.java.j2seproject + + + ImageApplication + 1.6.5 + + + + + + + + + diff --git a/output.jpg b/output.jpg new file mode 100644 index 0000000000000000000000000000000000000000..444e1b31099d8b36d5639d7082e510ef9d80db9d GIT binary patch literal 72130 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 SQB9hZ>16)); + int green = (0xff & (p>>8)); + int blue = (0xff & p); + histr[red]++;histb[blue]++;histg[green]++; + } + for(int i=0;i<256;i++){ +sum=sum +i*(histr[i]+histg[i]+histb[i]); +} +sum=sum/(width*height); +int diff=normal-sum; +increase=diff*approach/100; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + + public int ProcessPixel(int pixel) { + + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + + red+=increase; + green+=increase; + blue+=increase; + + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + + +} diff --git a/src/Effects/AutoColor.java b/src/Effects/AutoColor.java new file mode 100644 index 0000000..bd2fc9b --- /dev/null +++ b/src/Effects/AutoColor.java @@ -0,0 +1,75 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +/** + * + * @author Govind + */ +public class AutoColor implements Effects{ + + private int increase; + private float corr,corg,corb; + int approach=50; + + public AutoColor() { + + } + public AutoColor(int a) + {approach=a;} + public void Filter(int[] pixels, int width, int height, int sliderval) { + + int normal=128; int sumr=0;int sumg=0;int sumb=0; + + int[] histr=new int[256],histg=new int[256],histb=new int[256]; + for(int i=0;i<256;i++) + { + histr[i]=0; + histg[i]=0; + histb[i]=0; + } + for(int i=0;i>16)); + int green = (0xff & (p>>8)); + int blue = (0xff & p); + histr[red]++;histb[blue]++;histg[green]++; + } + for(int i=0;i<256;i++){ +sumr=sumr +i*histr[i]; +sumg=sumg +i*histg[i]; +sumb=sumb +i*histb[i]; +} + +corr=(sumg+sumb)/(1+sumr); +corg=(sumb+sumr)/(1+sumg); +corb=(sumr+sumg)/(1+sumb); + + System.out.println(corr); +System.out.println(corg); +System.out.println(corb); + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + + public int ProcessPixel(int pixel) { + + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + + red+=(int) (red*corr * approach / 100); + green+=(int) (green*corg * approach / 100); + blue+=(int) (blue*corb * approach / 100); + + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + } diff --git a/src/Effects/AutoContrast.java b/src/Effects/AutoContrast.java new file mode 100644 index 0000000..af70b8c --- /dev/null +++ b/src/Effects/AutoContrast.java @@ -0,0 +1,83 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +/** + * + * @author Govind + */ +public class AutoContrast implements Effects{ + int normal=128; int approach=50; + public AutoContrast(){} + public AutoContrast(int n,int a) + {normal =n;approach=a;} +private int mod(int num) +{ + int pos; + if(num>=0) pos=num; + else pos=(-1)*num; + return pos; +} +private int nearest(int r,int a,int b) +{ + if(mod(r-a)>16)); + int green = (0xff & (p>>8)); + int blue = (0xff & p); + histr[red]++;histb[blue]++;histg[green]++; + } + for(int i=0;i<256;i++){ +stdevr+=i*(histr[i]-normal); +stdevg+=i*(histg[i]-normal); +stdevb+=i*(histb[i]-normal); +} + +stdevr=stdevr/(width*height); +stdevg=stdevg/(width*height); +stdevb=stdevb/(width*height); +int stdev=(stdevr+stdevg+stdevb)/3; +int span=stdev-nearest(stdev,normal/2,3*normal/2); +int decrease=span*approach/100; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i],decrease); + } + } + + public int ProcessPixel(int pixel,int decrease) { + + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + + red-=decrease; + green-=decrease; + blue-=decrease; + + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + + public int ProcessPixel(int pixel) { + throw new UnsupportedOperationException("Not supported yet."); + } + + +} + diff --git a/src/Effects/BlueAdjust.java b/src/Effects/BlueAdjust.java new file mode 100644 index 0000000..b515316 --- /dev/null +++ b/src/Effects/BlueAdjust.java @@ -0,0 +1,45 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class BlueAdjust implements Effects{ + private int value; + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + blue = blue + value; + + if (blue > 255) { + blue = 255; + } + if (blue < 0) { + blue = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } + +} diff --git a/src/Effects/Brighten.java b/src/Effects/Brighten.java new file mode 100644 index 0000000..4650b07 --- /dev/null +++ b/src/Effects/Brighten.java @@ -0,0 +1,61 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package Effects; + +/** + * + * @author Govind + */ +public class Brighten implements Effects { + + private int value; + + public Brighten() { + } + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + red = red + value; + green = green + value; + blue = blue + value; + + if (red > 255) { + red = 255; + } + if (red < 0) { + red = 0; + } + if (green > 255) { + green = 255; + } + if (green < 0) { + green = 0; + } + if (blue > 255) { + blue = 255; + } + if (blue < 0) { + blue = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } + + +} diff --git a/src/Effects/Contrast.java b/src/Effects/Contrast.java new file mode 100644 index 0000000..759909c --- /dev/null +++ b/src/Effects/Contrast.java @@ -0,0 +1,56 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class Contrast implements Effects { +private int value; + public void Filter(int[] pixels, int width, int height, int sliderval) { + value = sliderval; + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int grey = 128;int approach=-100; + if(value>-100){approach = value;} + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + red = red + (red - grey) * approach / 100; + green = green + (green - grey) * approach / 100; + blue = blue + (blue - grey) * approach / 100; + // int lum = (int) ((0.299 * red) + (0.587 * green) + (0.114 * blue)); + if (red > 255) { + red = 255; + } + if (red < 0) { + red = 0; + } + if (green > 255) { + green = 255; + } + if (green < 0) { + green = 0; + } + if (blue > 255) { + blue = 255; + } + if (blue < 0) { + blue = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } + + +} diff --git a/src/Effects/ConvoEffect.java b/src/Effects/ConvoEffect.java new file mode 100644 index 0000000..ed289e5 --- /dev/null +++ b/src/Effects/ConvoEffect.java @@ -0,0 +1,91 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ConvolveOp; +import java.awt.image.ImageObserver; +import java.awt.image.Kernel; + +/** + * + * @author Govind + */ +public class ConvoEffect { + BufferedImage bufim; + float[] kernel; + BufferedImageOp ConvOp; + +public ConvoEffect(String Operation) + { + if(Operation.equals("Sharpen")) + { + kernel = new float[] { + 0.0f, -1.0f, 0.0f, + -1.0f, 5.0f, -1.0f, + 0.0f, -1.0f, 0.0f + }; + } +else if(Operation.equals("Blur")) + {float num = 1.0f/9.0f; + kernel = new float[] { + num, num, num, + num, num, num, + num, num, num +}; + } +else if(Operation.equals("Bump")) + { + kernel = new float[] { + 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f,-1.0f +}; + } +else if(Operation.equals("Edge")) + { + kernel = new float[] { + 0.0f, -1.0f, 0.0f, + -1.0f, 4.0f, -1.0f, + 0.0f, -1.0f, 0.0f +}; + } + +else if(Operation.equals("Emboss")) + { + kernel = new float[] { + -1.0f, -1.0f, 0.0f, + -1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 1.0f +}; + } +else if(Operation.equals("Glow")) +{float num = 1.0f/9.0f; + kernel = new float[] { + num, num, num, + num, 7*num, num, + num, num, num +}; +} + ConvOp = new ConvolveOp(new Kernel(3, 3,kernel)); + } + +public Image Filter(Image image,ImageObserver im) + { int width = image.getWidth(null); + int height = image.getHeight(null); + + bufim = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = bufim.createGraphics(); + g2d.drawImage(image,0,0,im); + + image = ConvOp.filter(bufim, null); + return image; +} + +} diff --git a/src/Effects/DustFilter.java b/src/Effects/DustFilter.java new file mode 100644 index 0000000..a1f2d60 --- /dev/null +++ b/src/Effects/DustFilter.java @@ -0,0 +1,85 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +/** + * + * @author Govind + */ +public class DustFilter implements Effects{ + +private int rr,gg,bb,r,g,b; + + +private int mod(int num) +{ + int pos; + if(num>=0) pos=num; + else pos=(-1)*num; + return pos; +} + + public void Filter(int[] pixels, int width, int height, int sliderval) { + + int normal=128; int approach=50;int sum=0,flag=0; + + for(int ii=width;ii0&&j>16)); + gg+=(0xff & (p>>8)); + bb+=(0xff & p); + } + else + { + r=(0xff & (p>>16)); + g=(0xff & (p>>8)); + b=(0xff & p); + + } + } + } + + if(mod(r*8-rr)>normal*4||mod(g*8-gg)>normal*4||mod(b*8-bb)>normal*4) + { + int red=rr/8; + int green=gg/8; + int blue=(bb/8); +if(flag<10) +{ + System.out.println(blue); + flag++; +} + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixels[ii] =(0xff000000 | red << 16 | green << 8 | blue); + //if(flag<10) System.out.println(pixels[ii]); + } + } + + } + + } + + public int ProcessPixel(int pixel) { + throw new UnsupportedOperationException("Not supported yet."); + } + + + + +} diff --git a/src/Effects/Effects.java b/src/Effects/Effects.java new file mode 100644 index 0000000..370f7f4 --- /dev/null +++ b/src/Effects/Effects.java @@ -0,0 +1,19 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import java.awt.Image; + +/** + * + * @author Govind + */ +public interface Effects { + + void Filter(int pixels[],int width,int height,int sliderval); + int ProcessPixel(int pixel); + +} diff --git a/src/Effects/Granulate.java b/src/Effects/Granulate.java new file mode 100644 index 0000000..7f37b5b --- /dev/null +++ b/src/Effects/Granulate.java @@ -0,0 +1,38 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class Granulate implements Effects{ + + + public void Filter(int[] pixels, int width, int height, int sliderval) { +float tmp;int marked; int mark[]=new int [width * height]; +for (int j = 0; j < 100; j++) +for (int i = 0; i < 100; i++) +{ +tmp = (float) (Math.random ( ) * (width * height)); +marked = (int) (tmp); +while (mark [marked] == 1) +{ +tmp = (float) (Math.random ( ) * (width * height)); +marked = (int) (tmp); +} +mark [marked] = 1; +pixels [marked] = pixels [j * width + i]; +} + } + + public int ProcessPixel(int pixel) { + throw new UnsupportedOperationException("Not supported yet."); + } + +} diff --git a/src/Effects/GreenAdjust.java b/src/Effects/GreenAdjust.java new file mode 100644 index 0000000..5c702e1 --- /dev/null +++ b/src/Effects/GreenAdjust.java @@ -0,0 +1,44 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class GreenAdjust implements Effects{ + private int value; + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + green = green + value; + + if (green > 255) { + green = 255; + } + if (green < 0) { + green = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } +} diff --git a/src/Effects/GreyScale.java b/src/Effects/GreyScale.java new file mode 100644 index 0000000..3449e5a --- /dev/null +++ b/src/Effects/GreyScale.java @@ -0,0 +1,34 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +/** + * + * @author Govind + */ +public class GreyScale implements Effects{ + private int value; + + public void Filter(int[] pixels, int width, int height, int sliderval) { + value = sliderval/50 + 1; + for(int k=1; k < value; k++){ + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & (pixel)); + int avg = (int)((red + green + blue)/3); + pixel = (0xff000000 | avg <<16 |green << 8 | avg); + return pixel; + } + + +} diff --git a/src/Effects/Hue.java b/src/Effects/Hue.java new file mode 100644 index 0000000..999e013 --- /dev/null +++ b/src/Effects/Hue.java @@ -0,0 +1,65 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; +import java.awt.Color; + +/** + * + * @author Govind + */ +public class Hue implements Effects { + + private int value; + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + float hsb[] = Color.RGBtoHSB(red, green, blue, null); + hsb[0]=hsb[0]+(value/100.0f); + // hsb[1]=hsb[1]+value; + pixel = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]); + red = (0xff & (pixel >> 16)); + green = (0xff & (pixel >> 8)); + blue = (0xff & pixel); + if (red > 255) { + red = 255; + } + if (red < 0) { + red = 0; + } + if (green > 255) { + green = 255; + } + if (green < 0) { + green = 0; + } + if (blue > 255) { + blue = 255; + } + if (blue < 0) { + blue = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } +} + + diff --git a/src/Effects/Invert.java b/src/Effects/Invert.java new file mode 100644 index 0000000..b27e291 --- /dev/null +++ b/src/Effects/Invert.java @@ -0,0 +1,38 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class Invert implements Effects{ + + public void Filter(int[] pixels, int width, int height, int sliderval) { + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + + public int ProcessPixel(int pixel) { + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + red = 256 - red; + green= 256 - green; + blue = 256 - blue; + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + + +} diff --git a/src/Effects/Posterize.java b/src/Effects/Posterize.java new file mode 100644 index 0000000..5d41deb --- /dev/null +++ b/src/Effects/Posterize.java @@ -0,0 +1,36 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class Posterize implements Effects { + + public void Filter(int[] pixels, int width, int height, int sliderval) { + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + + public int ProcessPixel(int pixel) { + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + red = (red-(red%64)); + green= (green-(green%64)); + blue = (blue-(blue%64)); + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + +} diff --git a/src/Effects/RedAdjust.java b/src/Effects/RedAdjust.java new file mode 100644 index 0000000..abb2f1d --- /dev/null +++ b/src/Effects/RedAdjust.java @@ -0,0 +1,44 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import Effects.Effects; + +/** + * + * @author Govind + */ +public class RedAdjust implements Effects{ + private int value; + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + red = red + value; + + if (red > 255) { + red = 255; + } + if (red < 0) { + red = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } +} diff --git a/src/Effects/Saturation.java b/src/Effects/Saturation.java new file mode 100644 index 0000000..34d57c9 --- /dev/null +++ b/src/Effects/Saturation.java @@ -0,0 +1,61 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +import java.awt.Color; + +/** + * + * @author Govind + */ +public class Saturation implements Effects { + + private int value; + + + public void Filter(int pixels[], int width, int height, int sliderval) { + + value = sliderval; + + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + + } + + public int ProcessPixel(int pixel) { + int red = (0xff & (pixel >> 16)); + int green = (0xff & (pixel >> 8)); + int blue = (0xff & pixel); + + float hsb[] = Color.RGBtoHSB(red, green, blue, null); + hsb[1]=hsb[1]+(value/100.0f); + pixel = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]); + red = (0xff & (pixel >> 16)); + green = (0xff & (pixel >> 8)); + blue = (0xff & pixel); + if (red > 255) { + red = 255; + } + if (red < 0) { + red = 0; + } + if (green > 255) { + green = 255; + } + if (green < 0) { + green = 0; + } + if (blue > 255) { + blue = 255; + } + if (blue < 0) { + blue = 0; + } + pixel = (0xff000000 | red << 16 | green << 8 | blue); + return pixel; + } +} diff --git a/src/Effects/Treshold.java b/src/Effects/Treshold.java new file mode 100644 index 0000000..0e3989d --- /dev/null +++ b/src/Effects/Treshold.java @@ -0,0 +1,44 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package Effects; + +/** + * + * @author Govind + */ +public class Treshold implements Effects{ + + public void Filter(int[] pixels, int width, int height, int sliderval) { + for (int i = 0; i < width * height; i++) { + pixels[i] = ProcessPixel(pixels[i]); + } + } + + public int ProcessPixel(int pixel) { + int red =(0xff & (pixel>>16)); + int green = (0xff & (pixel>>8)); + int blue = (0xff & pixel); + int gr=(int)(0.3*red+0.59*green+0.11*blue); + + int th = 128; + if(gr>=th) + {red=250; + blue=250; + green=250;} + else + {red = 10; + green= 10; + blue = 10; + } + if (red > 255) red =255;if(red<0) red=0; + if (green > 255) green=255;if(green<0) green=0; + if (blue >255) blue =255;if(blue<0) blue=0; + pixel = (0xff000000 | red << 16 | green <<8 | blue); + return pixel; + } + + +} diff --git a/src/imageapplication/ExampleFileFilter.java b/src/imageapplication/ExampleFileFilter.java new file mode 100644 index 0000000..9c98420 --- /dev/null +++ b/src/imageapplication/ExampleFileFilter.java @@ -0,0 +1,222 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package imageapplication; + + +import java.io.File; +import java.util.Hashtable; +import java.util.Enumeration; +import javax.swing.*; +import javax.swing.filechooser.*; + +public class ExampleFileFilter extends FileFilter { + + private static String TYPE_UNKNOWN = "Type Unknown"; + private static String HIDDEN_FILE = "Hidden File"; + + private Hashtable filters = null; + private String description = null; + private String fullDescription = null; + private boolean useExtensionsInDescription = true; + + /** + * Creates a file filter. If no filters are added, then all + * files are accepted. + * + * @see #addExtension + */ + public ExampleFileFilter() { + this.filters = new Hashtable(); + } + + /** + * Creates a file filter that accepts files with the given extension. + * Example: new ExampleFileFilter("jpg"); + * + * @see #addExtension + */ + public ExampleFileFilter(String extension) { + this(extension,null); + } + + /** + * Creates a file filter that accepts the given file type. + * Example: new ExampleFileFilter("jpg", "JPEG Image Images"); + * + * Note that the "." before the extension is not needed. If + * provided, it will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String extension, String description) { + this(); + if(extension!=null) addExtension(extension); + if(description!=null) setDescription(description); + } + + /** + * Creates a file filter from the given string array. + * Example: new ExampleFileFilter(String {"gif", "jpg"}); + * + * Note that the "." before the extension is not needed adn + * will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String[] filters) { + this(filters, null); + } + + /** + * Creates a file filter from the given string array and description. + * Example: new ExampleFileFilter(String {"gif", "jpg"}, "Gif and JPG Images"); + * + * Note that the "." before the extension is not needed and will be ignored. + * + * @see #addExtension + */ + public ExampleFileFilter(String[] filters, String description) { + this(); + for (int i = 0; i < filters.length; i++) { + // add filters one by one + addExtension(filters[i]); + } + if(description!=null) setDescription(description); + } + + /** + * Return true if this file should be shown in the directory pane, + * false if it shouldn't. + * + * Files that begin with "." are ignored. + * + * @see #getExtension + * @see FileFilter#accepts + */ + public boolean accept(File f) { + if(f != null) { + if(f.isDirectory()) { + return true; + } + String extension = getExtension(f); + if(extension != null && filters.get(getExtension(f)) != null) { + return true; + }; + } + return false; + } + + /** + * Return the extension portion of the file's name . + * + * @see #getExtension + * @see FileFilter#accept + */ + public String getExtension(File f) { + if(f != null) { + String filename = f.getName(); + int i = filename.lastIndexOf('.'); + if(i>0 && i + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/imageapplication/MainFrame.java b/src/imageapplication/MainFrame.java new file mode 100644 index 0000000..151ba79 --- /dev/null +++ b/src/imageapplication/MainFrame.java @@ -0,0 +1,1184 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package imageapplication; + +import Effects.Posterize; +import Effects.Treshold; +import Effects.Saturation; +import Effects.RedAdjust; +import Effects.Hue; +import Effects.GreyScale; +import Effects.GreenAdjust; +import Effects.Granulate; +import Effects.Contrast; +import Effects.BlueAdjust; +import Effects.AutoColor; +import Effects.AutoBrighten; +import Effects.AutoContrast; +import Effects.Invert; +import Effects.Effects; +import Effects.Brighten; +import Effects.ConvoEffect; +import Effects.DustFilter; +import java.awt.AlphaComposite; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.MediaTracker; +import java.awt.Point; +import java.awt.RenderingHints; +import java.awt.color.ColorSpace; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ColorConvertOp; +import java.awt.image.ConvolveOp; +import java.awt.image.CropImageFilter; +import java.awt.image.FilteredImageSource; +import java.awt.image.ImageFilter; +import java.awt.image.Kernel; +import java.awt.image.MemoryImageSource; +import java.awt.image.PixelGrabber; +import java.awt.image.RenderedImage; +import java.io.File; +import java.io.FileFilter; +import java.io.IOException; +import java.lang.String; +import javax.imageio.ImageIO; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JSlider; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +/** + * + * @author Govind + */ +public class MainFrame extends javax.swing.JFrame implements ChangeListener, MouseListener { + + ImageViewer imageviewer1; + int pixels[]; + Effects CurrEffect; + ConvoEffect ConvEffect; + private BufferedImage bufim; + int mx1,my1,mx2,my2,ismouseclicked=0,crop=1; + + /** Creates new form MainFrame */ + public MainFrame() { + initComponents(); + AdjModule1.setLocation(200,200); + AdjModule1.setSize(320, 150); + AdjModule1.setTitle("Adjust"); + AdjModule1.setClosable(true); + + jSlider1.setMaximum(256); + jSlider1.setMinimum(-150); + jSlider1.setMajorTickSpacing(50); + jSlider1.setMinorTickSpacing(10); + jSlider1.setValue(50); + jSlider1.setPaintTicks(true); + jSlider1.addChangeListener(this); + this.add(AdjModule1); + + } + + private void InitPixels(Image image) { + int width = image.getWidth(null); + int height = image.getHeight(null); + pixels = new int[width * height]; + + PixelGrabber pg = new PixelGrabber(image, 0, 0, width, height, pixels, 0, width); + + try { + pg.grabPixels(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + ConfirmDialog = new javax.swing.JDialog(); + jLabel1 = new javax.swing.JLabel(); + jButton6 = new javax.swing.JButton(); + jButton5 = new javax.swing.JButton(); + ResizeDialog = new javax.swing.JDialog(); + jSpinner1 = new javax.swing.JSpinner(); + jSpinner2 = new javax.swing.JSpinner(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jButton16 = new javax.swing.JButton(); + jButton17 = new javax.swing.JButton(); + AdjModule1 = new javax.swing.JInternalFrame(); + jSlider1 = new javax.swing.JSlider(); + jButton27 = new javax.swing.JButton(); + jButton28 = new javax.swing.JButton(); + AutomaticControlsPanel = new javax.swing.JPanel(); + AutoBrightenButton = new javax.swing.JButton(); + AutoColorButton = new javax.swing.JButton(); + AutoContrastButton = new javax.swing.JButton(); + DustFilterButton = new javax.swing.JButton(); + GlowButton = new javax.swing.JButton(); + AutoEnhanceButton = new javax.swing.JButton(); + ManualControlsPanel = new javax.swing.JPanel(); + BrightenButton = new javax.swing.JButton(); + ContrastButton = new javax.swing.JButton(); + GreyScaleButton = new javax.swing.JButton(); + InvertButton = new javax.swing.JButton(); + PosterizeButton = new javax.swing.JButton(); + TresholdButton = new javax.swing.JButton(); + SharpenButton = new javax.swing.JButton(); + BlurButton = new javax.swing.JButton(); + BumpButton = new javax.swing.JButton(); + EdgeDetectButton = new javax.swing.JButton(); + ResizeButton = new javax.swing.JButton(); + EmbossButton = new javax.swing.JButton(); + RedAdjButton = new javax.swing.JButton(); + BlueAdjButton = new javax.swing.JButton(); + GreenAdjButton = new javax.swing.JButton(); + HueButton = new javax.swing.JButton(); + SaturationButton = new javax.swing.JButton(); + GranulateButton = new javax.swing.JButton(); + CropButton = new javax.swing.JButton(); + jMenuBar1 = new javax.swing.JMenuBar(); + FileMenu = new javax.swing.JMenu(); + OpenMenuItem = new javax.swing.JMenuItem(); + SaveMenuItem = new javax.swing.JMenuItem(); + QuitMenuItem = new javax.swing.JMenuItem(); + EditMenu = new javax.swing.JMenu(); + jMenuItem1 = new javax.swing.JMenuItem(); + jMenuItem2 = new javax.swing.JMenuItem(); + + jLabel1.setText("Do You wish to Apply This Effect ?"); + + jButton6.setText("Cancel"); + jButton6.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton6ActionPerformed(evt); + } + }); + + jButton5.setText("Apply"); + jButton5.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton5ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ConfirmDialogLayout = new javax.swing.GroupLayout(ConfirmDialog.getContentPane()); + ConfirmDialog.getContentPane().setLayout(ConfirmDialogLayout); + ConfirmDialogLayout.setHorizontalGroup( + ConfirmDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ConfirmDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ConfirmDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(ConfirmDialogLayout.createSequentialGroup() + .addComponent(jLabel1) + .addContainerGap()) + .addGroup(ConfirmDialogLayout.createSequentialGroup() + .addComponent(jButton5) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton6) + .addGap(18, 18, 18)))) + ); + ConfirmDialogLayout.setVerticalGroup( + ConfirmDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ConfirmDialogLayout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE) + .addGap(18, 18, 18) + .addGroup(ConfirmDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jButton5) + .addComponent(jButton6)) + .addContainerGap()) + ); + + jLabel2.setText("Width: "); + + jLabel3.setText("Height:"); + + jLabel4.setText("Enter the new dimensions for the image:"); + + jButton16.setText("Apply"); + jButton16.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton16ActionPerformed(evt); + } + }); + + jButton17.setText("Cancel"); + jButton17.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton17ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ResizeDialogLayout = new javax.swing.GroupLayout(ResizeDialog.getContentPane()); + ResizeDialog.getContentPane().setLayout(ResizeDialogLayout); + ResizeDialogLayout.setHorizontalGroup( + ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ResizeDialogLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel4) + .addGroup(ResizeDialogLayout.createSequentialGroup() + .addGap(40, 40, 40) + .addGroup(ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ResizeDialogLayout.createSequentialGroup() + .addComponent(jLabel3) + .addGap(18, 18, 18) + .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(ResizeDialogLayout.createSequentialGroup() + .addComponent(jLabel2) + .addGap(18, 18, 18) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) + .addGap(48, 48, 48))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, ResizeDialogLayout.createSequentialGroup() + .addGap(24, 24, 24) + .addComponent(jButton16) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 34, Short.MAX_VALUE) + .addComponent(jButton17) + .addGap(32, 32, 32)) + ); + ResizeDialogLayout.setVerticalGroup( + ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ResizeDialogLayout.createSequentialGroup() + .addGap(43, 43, 43) + .addComponent(jLabel4) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jSpinner1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel2)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jLabel3) + .addComponent(jSpinner2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 30, Short.MAX_VALUE) + .addGroup(ResizeDialogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jButton17) + .addComponent(jButton16, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(19, 19, 19)) + ); + + jButton27.setText("Apply"); + jButton27.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton27ActionPerformed(evt); + } + }); + + jButton28.setText("Cancel"); + jButton28.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jButton28ActionPerformed(evt); + } + }); + + javax.swing.GroupLayout AdjModule1Layout = new javax.swing.GroupLayout(AdjModule1.getContentPane()); + AdjModule1.getContentPane().setLayout(AdjModule1Layout); + AdjModule1Layout.setHorizontalGroup( + AdjModule1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(AdjModule1Layout.createSequentialGroup() + .addGap(22, 22, 22) + .addGroup(AdjModule1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(AdjModule1Layout.createSequentialGroup() + .addComponent(jButton27) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jButton28)) + .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addContainerGap(26, Short.MAX_VALUE)) + ); + AdjModule1Layout.setVerticalGroup( + AdjModule1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(AdjModule1Layout.createSequentialGroup() + .addGap(30, 30, 30) + .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addGroup(AdjModule1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(jButton27) + .addComponent(jButton28)) + .addContainerGap(34, Short.MAX_VALUE)) + ); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setTitle("AUTIMEN - Auto Image Enhance !!!"); + setResizable(false); + + AutomaticControlsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Automatic Controls")); + + AutoBrightenButton.setText("AutoBrighten"); + AutoBrightenButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AutoBrightenButtonActionPerformed(evt); + } + }); + + AutoColorButton.setText("Auto Color"); + AutoColorButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AutoColorButtonActionPerformed(evt); + } + }); + + AutoContrastButton.setText("Auto Contrast"); + AutoContrastButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AutoContrastButtonActionPerformed(evt); + } + }); + + DustFilterButton.setText("Dust Filter"); + DustFilterButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + DustFilterButtonActionPerformed(evt); + } + }); + + GlowButton.setText("Glow"); + GlowButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GlowButtonActionPerformed(evt); + } + }); + + AutoEnhanceButton.setText("AutoEnhancement"); + AutoEnhanceButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + AutoEnhanceButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout AutomaticControlsPanelLayout = new javax.swing.GroupLayout(AutomaticControlsPanel); + AutomaticControlsPanel.setLayout(AutomaticControlsPanelLayout); + AutomaticControlsPanelLayout.setHorizontalGroup( + AutomaticControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(AutomaticControlsPanelLayout.createSequentialGroup() + .addGap(169, 169, 169) + .addComponent(AutoBrightenButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AutoColorButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AutoContrastButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(GlowButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(DustFilterButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(AutoEnhanceButton) + .addContainerGap(669, Short.MAX_VALUE)) + ); + AutomaticControlsPanelLayout.setVerticalGroup( + AutomaticControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, AutomaticControlsPanelLayout.createSequentialGroup() + .addContainerGap(41, Short.MAX_VALUE) + .addGroup(AutomaticControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(AutoBrightenButton) + .addComponent(AutoColorButton) + .addComponent(AutoContrastButton) + .addComponent(GlowButton) + .addComponent(DustFilterButton) + .addComponent(AutoEnhanceButton)) + .addGap(36, 36, 36)) + ); + + ManualControlsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Manual Controls")); + + BrightenButton.setText("Brighten"); + BrightenButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BrightenButtonActionPerformed(evt); + } + }); + + ContrastButton.setText("Contrast"); + ContrastButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ContrastButtonActionPerformed(evt); + } + }); + + GreyScaleButton.setText("GreyScale"); + GreyScaleButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GreyScaleButtonActionPerformed(evt); + } + }); + + InvertButton.setText("Invert"); + InvertButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + InvertButtonActionPerformed(evt); + } + }); + + PosterizeButton.setText("Posterize"); + PosterizeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + PosterizeButtonActionPerformed(evt); + } + }); + + TresholdButton.setText("Treshold"); + TresholdButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + TresholdButtonActionPerformed(evt); + } + }); + + SharpenButton.setText("Sharpen"); + SharpenButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SharpenButtonActionPerformed(evt); + } + }); + + BlurButton.setText("Blur"); + BlurButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BlurButtonActionPerformed(evt); + } + }); + + BumpButton.setText("Bump"); + BumpButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BumpButtonActionPerformed(evt); + } + }); + + EdgeDetectButton.setText("Edge Detection"); + EdgeDetectButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + EdgeDetectButtonActionPerformed(evt); + } + }); + + ResizeButton.setText("Resize"); + ResizeButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + ResizeButtonActionPerformed(evt); + } + }); + + EmbossButton.setText("Emboss"); + EmbossButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + EmbossButtonActionPerformed(evt); + } + }); + + RedAdjButton.setText("Red Adjust"); + RedAdjButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + RedAdjButtonActionPerformed(evt); + } + }); + + BlueAdjButton.setText("Blue Adjust"); + BlueAdjButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + BlueAdjButtonActionPerformed(evt); + } + }); + + GreenAdjButton.setText("Green Adjust"); + GreenAdjButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GreenAdjButtonActionPerformed(evt); + } + }); + + HueButton.setText("Hue Adjust "); + HueButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + HueButtonActionPerformed(evt); + } + }); + + SaturationButton.setText("Saturation Adjust"); + SaturationButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaturationButtonActionPerformed(evt); + } + }); + + GranulateButton.setText("Granulate"); + GranulateButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + GranulateButtonActionPerformed(evt); + } + }); + + CropButton.setText("Crop"); + CropButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + CropButtonActionPerformed(evt); + } + }); + + javax.swing.GroupLayout ManualControlsPanelLayout = new javax.swing.GroupLayout(ManualControlsPanel); + ManualControlsPanel.setLayout(ManualControlsPanelLayout); + ManualControlsPanelLayout.setHorizontalGroup( + ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addGap(159, 159, 159) + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addComponent(BrightenButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(ContrastButton)) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addComponent(ResizeButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(RedAdjButton))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addComponent(BlueAdjButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(GreenAdjButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(HueButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(SaturationButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(GranulateButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(CropButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(EmbossButton)) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addComponent(GreyScaleButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(InvertButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(PosterizeButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(TresholdButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(SharpenButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(BlurButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(BumpButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(EdgeDetectButton))) + .addContainerGap(447, Short.MAX_VALUE)) + ); + ManualControlsPanelLayout.setVerticalGroup( + ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(BrightenButton) + .addComponent(ContrastButton)) + .addGap(18, 18, 18) + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(ResizeButton) + .addComponent(RedAdjButton))) + .addGroup(ManualControlsPanelLayout.createSequentialGroup() + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(GreyScaleButton) + .addComponent(InvertButton) + .addComponent(PosterizeButton) + .addComponent(TresholdButton) + .addComponent(SharpenButton) + .addComponent(BlurButton) + .addComponent(BumpButton) + .addComponent(EdgeDetectButton)) + .addGap(18, 18, 18) + .addGroup(ManualControlsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(BlueAdjButton) + .addComponent(GreenAdjButton) + .addComponent(HueButton) + .addComponent(SaturationButton) + .addComponent(GranulateButton) + .addComponent(CropButton) + .addComponent(EmbossButton)))) + .addContainerGap(25, Short.MAX_VALUE)) + ); + + FileMenu.setText("File"); + + OpenMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); + OpenMenuItem.setText("Open"); + OpenMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + OpenMenuItemActionPerformed(evt); + } + }); + FileMenu.add(OpenMenuItem); + + SaveMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK)); + SaveMenuItem.setText("Save"); + SaveMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + SaveMenuItemActionPerformed(evt); + } + }); + FileMenu.add(SaveMenuItem); + + QuitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK)); + QuitMenuItem.setText("Quit"); + QuitMenuItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + QuitMenuItemActionPerformed(evt); + } + }); + FileMenu.add(QuitMenuItem); + + jMenuBar1.add(FileMenu); + + EditMenu.setText("Help"); + + jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_H, java.awt.event.InputEvent.CTRL_MASK)); + jMenuItem1.setText("Contents"); + jMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jMenuItem1ActionPerformed(evt); + } + }); + EditMenu.add(jMenuItem1); + + jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK)); + jMenuItem2.setText("About Us"); + jMenuItem2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jMenuItem2ActionPerformed(evt); + } + }); + EditMenu.add(jMenuItem2); + + jMenuBar1.add(EditMenu); + + setJMenuBar(jMenuBar1); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(AutomaticControlsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(ManualControlsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGap(10, 10, 10)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(AutomaticControlsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 506, Short.MAX_VALUE) + .addComponent(ManualControlsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void OpenMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenMenuItemActionPerformed + imageviewer1 = new ImageViewer(); + imageviewer1.addMouseListener(this); + this.add(imageviewer1); + this.pack(); + imageviewer1.setVisible(true); + InitPixels(imageviewer1.image); + // TODO add your handling code here: +}//GEN-LAST:event_OpenMenuItemActionPerformed + + private void BrightenButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BrightenButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new Brighten(); + // TODO add your handling code here: +}//GEN-LAST:event_BrightenButtonActionPerformed + + private void ContrastButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ContrastButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new Contrast(); + // TODO add your handling code here: +}//GEN-LAST:event_ContrastButtonActionPerformed + + private void GreyScaleButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GreyScaleButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new GreyScale(); + // TODO add your handling code here: +}//GEN-LAST:event_GreyScaleButtonActionPerformed + + private void InvertButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_InvertButtonActionPerformed + CurrEffect = new Invert(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,250,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_InvertButtonActionPerformed + + private void PosterizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PosterizeButtonActionPerformed + CurrEffect = new Posterize(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,250,150); + imageviewer1.preview();// TODO add your handling code here: +}//GEN-LAST:event_PosterizeButtonActionPerformed + + private void TresholdButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TresholdButtonActionPerformed + CurrEffect = new Treshold(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_TresholdButtonActionPerformed + + private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed + imageviewer1.setSize(imageviewer1.image.getWidth(null), imageviewer1.image.getHeight(null)); + imageviewer1.repaint(); + ConfirmDialog.setVisible(false); + // TODO add your handling code here: + }//GEN-LAST:event_jButton6ActionPerformed + + private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed + imageviewer1.switchimg(); + imageviewer1.repaint(); + ConfirmDialog.setVisible(false); + // TODO add your handling code here: + }//GEN-LAST:event_jButton5ActionPerformed + + private void AutoBrightenButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AutoBrightenButtonActionPerformed + CurrEffect = new AutoBrighten(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_AutoBrightenButtonActionPerformed + + private void SharpenButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SharpenButtonActionPerformed + + ConvEffect = new ConvoEffect("Sharpen"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_SharpenButtonActionPerformed + + private void BlurButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BlurButtonActionPerformed + ConvEffect = new ConvoEffect("Blur"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_BlurButtonActionPerformed + + private void BumpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BumpButtonActionPerformed + ConvEffect = new ConvoEffect("Bump"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_BumpButtonActionPerformed + + private void EdgeDetectButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EdgeDetectButtonActionPerformed + ConvEffect = new ConvoEffect("Edge"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_EdgeDetectButtonActionPerformed + + private void ResizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResizeButtonActionPerformed + + jSpinner1.setValue(imageviewer1.image.getWidth(null)); + jSpinner2.setValue(imageviewer1.image.getHeight(null)); + ResizeDialog.setVisible(true); + ResizeDialog.setBounds(200,200,250,200); + + // TODO add your handling code here: +}//GEN-LAST:event_ResizeButtonActionPerformed + + private void EmbossButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EmbossButtonActionPerformed + ConvEffect = new ConvoEffect("Emboss"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); // TODO add your handling code here: +}//GEN-LAST:event_EmbossButtonActionPerformed + + private void jButton16ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton16ActionPerformed + float width = imageviewer1.image.getWidth(null); + float height = imageviewer1.image.getHeight(null); + + bufim = new BufferedImage((int)width,(int)height,BufferedImage.TYPE_INT_RGB); + Integer w= (Integer) jSpinner1.getValue(); + Integer h= (Integer) jSpinner2.getValue(); + ResizeDialog.setVisible(false); + + float widthratio = (((float)w.doubleValue())/((float)width));float heightratio = ((float)h.intValue())/((float)(height)); + + Graphics2D g2d = bufim.createGraphics(); + g2d.drawImage(imageviewer1.image,0,0,this); + +AffineTransform transform = AffineTransform.getScaleInstance(widthratio, heightratio); +AffineTransformOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR); + +imageviewer1.image = op.filter(bufim, null); + + imageviewer1.setSize(imageviewer1.image.getWidth(null), imageviewer1.image.getHeight(null)); + imageviewer1.repaint(); + + // TODO add your handling code here: + }//GEN-LAST:event_jButton16ActionPerformed + + private void jButton17ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton17ActionPerformed +ResizeDialog.setVisible(false); + // TODO add your handling code here: + }//GEN-LAST:event_jButton17ActionPerformed + + private void RedAdjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RedAdjButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new RedAdjust(); + // TODO add your handling code here: +}//GEN-LAST:event_RedAdjButtonActionPerformed + + private void BlueAdjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BlueAdjButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new BlueAdjust(); // TODO add your handling code here: +}//GEN-LAST:event_BlueAdjButtonActionPerformed + + private void GreenAdjButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GreenAdjButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new GreenAdjust(); // TODO add your handling code here: +}//GEN-LAST:event_GreenAdjButtonActionPerformed + + private void HueButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_HueButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new Hue(); + // TODO add your handling code here: +}//GEN-LAST:event_HueButtonActionPerformed + + private void SaturationButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaturationButtonActionPerformed + AdjModule1.setVisible(true); + CurrEffect = new Saturation(); + // TODO add your handling code here: +}//GEN-LAST:event_SaturationButtonActionPerformed + + private void GranulateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GranulateButtonActionPerformed + CurrEffect = new Granulate(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); // TODO add your handling code here: +}//GEN-LAST:event_GranulateButtonActionPerformed + + private void AutoColorButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AutoColorButtonActionPerformed + CurrEffect = new AutoColor(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_AutoColorButtonActionPerformed + + private void jButton27ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton27ActionPerformed + imageviewer1.switchimg(); + imageviewer1.repaint(); + AdjModule1.setVisible(false); + jSlider1.setValue(50); + // TODO add your handling code here: +}//GEN-LAST:event_jButton27ActionPerformed + + private void jButton28ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton28ActionPerformed + imageviewer1.repaint(); + AdjModule1.setVisible(false); + jSlider1.setValue(50); + // TODO add your handling code here: + }//GEN-LAST:event_jButton28ActionPerformed + + @SuppressWarnings("empty-statement") + private void CropButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CropButtonActionPerformed + crop=1; + // TODO add your handling code here: +}//GEN-LAST:event_CropButtonActionPerformed + + private void AutoContrastButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AutoContrastButtonActionPerformed + CurrEffect = new AutoContrast(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); // TODO add your handling code here: +}//GEN-LAST:event_AutoContrastButtonActionPerformed + + private void DustFilterButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DustFilterButtonActionPerformed + CurrEffect = new DustFilter(); + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); // TODO add your handling code here: +}//GEN-LAST:event_DustFilterButtonActionPerformed + + private void GlowButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GlowButtonActionPerformed + ConvEffect = new ConvoEffect("Glow"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview(); + // TODO add your handling code here: +}//GEN-LAST:event_GlowButtonActionPerformed + + private void QuitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_QuitMenuItemActionPerformed +this.dispose();// TODO add your handling code here: +}//GEN-LAST:event_QuitMenuItemActionPerformed + + private void SaveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveMenuItemActionPerformed + + int w = imageviewer1.image.getWidth(null); + int h = imageviewer1.image.getHeight(null); + int type = BufferedImage.TYPE_INT_RGB; // other options + bufim = new BufferedImage(w, h, type); + Graphics2D g2 = bufim.createGraphics(); + g2.drawImage(imageviewer1.image, 0, 0, null); + g2.dispose(); + JFrame f = new JFrame(); + JFileChooser chooser = new JFileChooser(); + + chooser.setDialogType( JFileChooser.SAVE_DIALOG ) ; + chooser.setAcceptAllFileFilterUsed(false); + + chooser.showSaveDialog(f); + File output = new File(chooser.getSelectedFile().toString()); + +try { + ImageIO.write(bufim,"jpg", output); // ignore returned boolean + } catch(IOException e) { + System.out.println("Write error for " + output.getPath() + + ": " + e.getMessage()); + } +// TODO add your handling code here: + }//GEN-LAST:event_SaveMenuItemActionPerformed + + private void AutoEnhanceButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AutoEnhanceButtonActionPerformed + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + CurrEffect = new DustFilter(); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,0); + + +for(int i=0;i<1;i++) +{ + ConvEffect = new ConvoEffect("Sharpen"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + ConvEffect = new ConvoEffect("Blur"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); +} + CurrEffect = new AutoContrast(128,50); + CurrEffect.Filter(pixels, width, height,0); + CurrEffect = new AutoColor(20); + CurrEffect.Filter(pixels, width, height,0); + CurrEffect = new AutoBrighten(150,20); + CurrEffect.Filter(pixels, width, height,0); + ConvEffect = new ConvoEffect("Glow"); + imageviewer1.image2=ConvEffect.Filter(imageviewer1.image,this); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.preview();// TODO add your handling code here: +}//GEN-LAST:event_AutoEnhanceButtonActionPerformed + + private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed +new h1().setVisible(true); // TODO add your handling code here: + }//GEN-LAST:event_jMenuItem1ActionPerformed + + private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed +new about().setVisible(true); // TODO add your handling code here: + }//GEN-LAST:event_jMenuItem2ActionPerformed + + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + + public void run() { + new MainFrame().setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JInternalFrame AdjModule1; + private javax.swing.JButton AutoBrightenButton; + private javax.swing.JButton AutoColorButton; + private javax.swing.JButton AutoContrastButton; + private javax.swing.JButton AutoEnhanceButton; + private javax.swing.JPanel AutomaticControlsPanel; + private javax.swing.JButton BlueAdjButton; + private javax.swing.JButton BlurButton; + private javax.swing.JButton BrightenButton; + private javax.swing.JButton BumpButton; + private javax.swing.JDialog ConfirmDialog; + private javax.swing.JButton ContrastButton; + private javax.swing.JButton CropButton; + private javax.swing.JButton DustFilterButton; + private javax.swing.JButton EdgeDetectButton; + private javax.swing.JMenu EditMenu; + private javax.swing.JButton EmbossButton; + private javax.swing.JMenu FileMenu; + private javax.swing.JButton GlowButton; + private javax.swing.JButton GranulateButton; + private javax.swing.JButton GreenAdjButton; + private javax.swing.JButton GreyScaleButton; + private javax.swing.JButton HueButton; + private javax.swing.JButton InvertButton; + private javax.swing.JPanel ManualControlsPanel; + private javax.swing.JMenuItem OpenMenuItem; + private javax.swing.JButton PosterizeButton; + private javax.swing.JMenuItem QuitMenuItem; + private javax.swing.JButton RedAdjButton; + private javax.swing.JButton ResizeButton; + private javax.swing.JDialog ResizeDialog; + private javax.swing.JButton SaturationButton; + private javax.swing.JMenuItem SaveMenuItem; + private javax.swing.JButton SharpenButton; + private javax.swing.JButton TresholdButton; + private javax.swing.JButton jButton16; + private javax.swing.JButton jButton17; + private javax.swing.JButton jButton27; + private javax.swing.JButton jButton28; + private javax.swing.JButton jButton5; + private javax.swing.JButton jButton6; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JMenuBar jMenuBar1; + private javax.swing.JMenuItem jMenuItem1; + private javax.swing.JMenuItem jMenuItem2; + private javax.swing.JSlider jSlider1; + private javax.swing.JSpinner jSpinner1; + private javax.swing.JSpinner jSpinner2; + // End of variables declaration//GEN-END:variables + + public void stateChanged(ChangeEvent e) { + JSlider slider = (JSlider) e.getSource(); + int value = slider.getValue() - 50; + + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + InitPixels(imageviewer1.image); + CurrEffect.Filter(pixels, width, height,value); + + imageviewer1.image2 = createImage(new MemoryImageSource(width, height, pixels, 0, width)); + imageviewer1.preview(); + + } + public void mouseClicked(MouseEvent e) { + ismouseclicked=1; + + } + + public void mousePressed(MouseEvent e) { + mx1=e.getX(); + my1=e.getY(); + System.out.println("Pressed at : " + e.getX() + " " +e.getY()); + } + + public void mouseReleased(MouseEvent e) { + mx2=e.getX(); + my2=e.getY(); + System.out.println("Released at : " + e.getX() + " " + e.getY()); + if(crop==1){ + int width = imageviewer1.image.getWidth(null); + int height = imageviewer1.image.getHeight(null); + + bufim = new BufferedImage((int)width,(int)height,BufferedImage.TYPE_INT_RGB); + + Graphics2D g2d = bufim.createGraphics(); + g2d.drawImage(imageviewer1.image,0,0,this); + g2d.draw3DRect(mx1,my1,(mx2-mx1),(my2-my1),true); + + imageviewer1.image2= bufim.getSubimage(mx1,my1,mx2-mx1,my2-my1); + ConfirmDialog.setVisible(true); + ConfirmDialog.setBounds(200,200,220,150); + imageviewer1.setSize(imageviewer1.image2.getWidth(null), imageviewer1.image2.getHeight(null)); + + imageviewer1.preview(); + + + crop=0; + } + + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } +} diff --git a/src/imageapplication/about.form b/src/imageapplication/about.form new file mode 100644 index 0000000..894f7ae --- /dev/null +++ b/src/imageapplication/about.form @@ -0,0 +1,80 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/imageapplication/about.java b/src/imageapplication/about.java new file mode 100644 index 0000000..8987419 --- /dev/null +++ b/src/imageapplication/about.java @@ -0,0 +1,86 @@ +/* + * about.java + * + * Created on 22 March, 2009, 1:02 PM + */ + +package imageapplication; + +/** + * + * @author ashes + */ +public class about extends javax.swing.JFrame { + + /** Creates new form about */ + public about() { + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + jScrollPane1 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + jLabel1 = new javax.swing.JLabel(); + + setTitle("About us "); + + jTextArea1.setBackground(new java.awt.Color(255, 255, 204)); + jTextArea1.setColumns(20); + jTextArea1.setEditable(false); + jTextArea1.setFont(new java.awt.Font("Purisa", 1, 18)); + jTextArea1.setRows(5); + jTextArea1.setText("Auto Image Enhancement and Restoration is \na graphical image editor. This project is implemented\nas a part of Software Engineering Lab by 3 year\nComputer Engineering B.Tech students\nAbhirup Dutta\nAshish G Bhat \nGovind Krishna\nunder the guidance of Shri Mahendra Pratap Singh. \n "); + jTextArea1.setCaretColor(new java.awt.Color(153, 0, 0)); + jScrollPane1.setViewportView(jTextArea1); + + jLabel1.setBackground(new java.awt.Color(255, 102, 51)); + jLabel1.setText("ABOUT US: "); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 318, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(423, Short.MAX_VALUE)) + .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 753, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(90, 90, 90)) + ); + + pack(); + }// //GEN-END:initComponents + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new about().setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JTextArea jTextArea1; + // End of variables declaration//GEN-END:variables + +} diff --git a/src/imageapplication/h1.form b/src/imageapplication/h1.form new file mode 100644 index 0000000..519971d --- /dev/null +++ b/src/imageapplication/h1.form @@ -0,0 +1,165 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/imageapplication/h1.java b/src/imageapplication/h1.java new file mode 100644 index 0000000..be658ea --- /dev/null +++ b/src/imageapplication/h1.java @@ -0,0 +1,153 @@ +/* + * h1.java + * + * Created on 30 March, 2009, 8:35 PM + */ + +package imageapplication; + +/** + * + * @author ashes + */ +public class h1 extends javax.swing.JFrame { + + /** Creates new form h1 */ + public h1() { + initComponents(); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + jScrollPane1 = new javax.swing.JScrollPane(); + jTextArea1 = new javax.swing.JTextArea(); + jRadioButton1 = new javax.swing.JRadioButton(); + jRadioButton2 = new javax.swing.JRadioButton(); + jLabel1 = new javax.swing.JLabel(); + jScrollPane2 = new javax.swing.JScrollPane(); + jTextArea2 = new javax.swing.JTextArea(); + jRadioButton3 = new javax.swing.JRadioButton(); + jRadioButton4 = new javax.swing.JRadioButton(); + + setTitle("Using AUTOIM-PRO"); + setBackground(new java.awt.Color(255, 255, 102)); + + jTextArea1.setBackground(new java.awt.Color(255, 254, 196)); + jTextArea1.setColumns(20); + jTextArea1.setEditable(false); + jTextArea1.setRows(5); + jTextArea1.setText("**********************\nAUTOMATIC OPTIONS\n**********************\nThe vital and important features of this product \nAutomatic Operations which include\n>AUTO BRIGHTNESS\n>AUTO CONTRAST \n>AUTO COLOR\n>AUTO Enhancement\n*****************\nOPENING A FILE:\n*****************\nFile > Open \n or\nhotkey : Ctrl+O\n *****************\nSAVING A FILE\n******************\nFile > Save \n or \nhotkey : Ctrl+O\n**********************\nIMAGE Enhancement\n**********************\nSelect the desired image enhancements you desire to\nperform on your image and slide the mouse pointer. \nThe slider moving towards right indicates greater \nvalue of enhancement and towards the left indicates\nlesser value.\nFor example :\n>Click on BRIGHTNESS button\n>To increase brightness, move the slider towards right.\n>To decrease brightness, move the slider towards left.\n\n***********************\nIMAGE transformation \n***********************\nRESIZE Image\n>Click on the resize button.\n>Specify the size i.e. height and width to resize the\n image.\n"); + jScrollPane1.setViewportView(jTextArea1); + + jRadioButton1.setText("OPEN/SAVING A FILE"); + + jRadioButton2.setText("IMAGE Enhancements"); + jRadioButton2.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jRadioButton2ActionPerformed(evt); + } + }); + + jLabel1.setText("CONTENTS"); + + jTextArea2.setColumns(20); + jTextArea2.setEditable(false); + jTextArea2.setFont(new java.awt.Font("URW Gothic L", 2, 18)); + jTextArea2.setForeground(new java.awt.Color(0, 102, 0)); + jTextArea2.setRows(5); + jTextArea2.setText("Brightness\nContrast\nGreyscale\nColor Invert\nPosterize\nThreshold\nSharpen\nBlur\nBump\nHue saturation"); + jScrollPane2.setViewportView(jTextArea2); + + buttonGroup1.add(jRadioButton3); + jRadioButton3.setText("AUTOMATIC Enhancements"); + + jRadioButton4.setText("IMAGE transformations"); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(17, 17, 17) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jRadioButton2) + .addComponent(jRadioButton1) + .addComponent(jRadioButton3) + .addComponent(jRadioButton4)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(layout.createSequentialGroup() + .addGap(82, 82, 82) + .addComponent(jLabel1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) + .addGap(34, 34, 34)) + .addGroup(layout.createSequentialGroup() + .addGap(77, 77, 77) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 436, javax.swing.GroupLayout.PREFERRED_SIZE)) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 480, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addGap(28, 28, 28) + .addComponent(jRadioButton3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jRadioButton1) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jRadioButton2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 248, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(18, 18, 18) + .addComponent(jRadioButton4))) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButton2ActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_jRadioButton2ActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + java.awt.EventQueue.invokeLater(new Runnable() { + public void run() { + new h1().setVisible(true); + } + }); + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JLabel jLabel1; + private javax.swing.JRadioButton jRadioButton1; + private javax.swing.JRadioButton jRadioButton2; + private javax.swing.JRadioButton jRadioButton3; + private javax.swing.JRadioButton jRadioButton4; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JScrollPane jScrollPane2; + private javax.swing.JTextArea jTextArea1; + private javax.swing.JTextArea jTextArea2; + // End of variables declaration//GEN-END:variables + +}