package Ġcom . gu ox ia ox ing . phoenix . picker . util Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Environment Ċ import Ġandroid . view . WindowManager Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ object ĠImage Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġfile Content Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġsave Picture ( context : ĠContext , Ġbitmap : ĠBitmap , Ġis K own Media : ĠBoolean ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmedia Storage Dir Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ DC IM ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! media Storage Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! media Storage Dir . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtime Stamp Ġ= ĠSimpleDateFormat (" yyyy MM dd _ HH mm ss ", ĠLocale . CH INA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( Date ()) Ġ+ ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" IMG _$ time Stamp . png " ĊĠĠĠĠĠĠĠ Ġval Ġabs Path Ġ= Ġmedia Storage Dir . path Ġ+ ĠFile . separator Ġ+ ĠfileName ĊĠĠĠĠĠĠĠ Ġval Ġmedia File Ġ= ĠFile ( abs Path ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠS aving Ġthe Ġbitmap ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠFileOutputStream ( media File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is K own Media ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Scanner Intent Ġ= ĠIntent ( Intent . ACTION _ MEDIA _ SCAN NER _ SCAN _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Content Uri Ġ= ĠUri . from File ( media File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Scanner Intent . data Ġ= Ġfile Content Uri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( media Scanner Intent ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Content Uri Ġ= ĠUri . parse ( abs Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Content Uri ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġro ate Picture ( rotation : ĠInt , Ġbitmap : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġval Ġold Bitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotation . toFloat ()) ĊĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Bitmap ( old Bitmap , Ġ 0 , Ġ 0 , Ġold Bitmap . width , Ġold Bitmap . height , Ġmatrix , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġold Bitmap . recycle () ĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġro ate Picture ( rotation : ĠInt , Ġdata : ĠByteArray , Ġcontext : ĠContext ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= Ġdecode Sample d Bitmap From Byte ( context , Ġdata ) ĊĠĠĠĠĠĠĠ Ġval Ġold Bitmap Ġ= Ġbitmap ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( rotation . toFloat ()) ĊĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap . create Bitmap ( old Bitmap , Ġ 0 , Ġ 0 , Ġold Bitmap . width , Ġold Bitmap . height , Ġmatrix , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġold Bitmap . recycle () ĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpath : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Exit Ġ= ĠEnvironment . get External Storage State () Ġ== ĠEnvironment . MEDIA _ MOUNT ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Exit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠEnvironment . get External Storage Directory () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġdecode Sample d Bitmap From Byte ( context : ĠContext , Ġbitmap Bytes : ĠByteArray ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Ġ= Ġ( context . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ). default Display ĊĊĠĠĠĠĠĠĠ Ġval Ġreq Width : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġreq Height : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint () ĊĠĠĠĠĠĠĠ Ġdisplay . getSize ( point ) ĊĠĠĠĠĠĠĠ Ġreq Width Ġ= Ġpoint . x ĊĠĠĠĠĠĠĠ Ġreq Height Ġ= Ġpoint . y ĊĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoptions . in Mutable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoptions . in Bitmap Ġ= ĠBitmap Factory . decode ByteArray ( bitmap Bytes , Ġ 0 , Ġbitmap Bytes . size , Ġoptions ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġin Sample Size ĊĠĠĠĠĠĠĠ Ġoptions . in Sample Size Ġ= Ġcalculate In Sample Size ( options , Ġreq Width , Ġreq Height ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġ& Ġresize Ġthe Ġimage Ġto Ġbe Ġ 1 / in Sample Size Ġdimensions ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġwhen Ġyou Ġdo Ġnot Ġwant Ġto Ġscale Ġthe Ġimage Ġwith Ġa Ġin Sample Size Ġthat Ġis Ġa Ġpower Ġof Ġ 2 ĊĠĠĠĠĠĠĠ Ġoptions . in Scaled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoptions . in Density Ġ= Ġoptions . out Width ĊĠĠĠĠĠĠĠ Ġoptions . in Target Density Ġ= Ġreq Width Ġ* Ġoptions . in Sample Size ĊĊĠĠĠĠĠĠĠ Ġ// ĠDecode Ġbitmap Ġwith Ġin Sample Size Ġset ĊĠĠĠĠĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse Ġ// ĠIf Ġset Ġto Ġtrue , Ġthe Ġdecoder Ġwill Ġreturn Ġnull Ġ( no Ġbitmap ), Ġbut Ġthe Ġout ... Ġfields Ġwill Ġstill Ġbe Ġset , Ġallowing Ġthe Ġcaller Ġto Ġquery Ġthe Ġbitmap Ġwithout Ġhaving Ġto Ġallocate Ġthe Ġmemory Ġfor Ġits Ġpixels . ĊĠĠĠĠĠĠĠ Ġoptions . in Purge able Ġ= Ġtrue ĠĠĠĠĠĠĠĠ Ġ// ĠTell Ġto Ġgc Ġthat Ġwhether Ġit Ġneeds Ġfree Ġmemory , Ġthe ĠBitmap Ġcan Ġbe Ġcleared ĊĠĠĠĠĠĠĠ Ġoptions . in Input Share able Ġ= Ġtrue ĠĠĠ Ġ// ĠWhich Ġkind Ġof Ġreference Ġwill Ġbe Ġused Ġto Ġrecover Ġthe ĠBitmap Ġdata Ġafter Ġbeing Ġclear , Ġwhen Ġit Ġwill Ġbe Ġused Ġin Ġthe Ġfuture ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap Factory . decode ByteArray ( bitmap Bytes , Ġ 0 , Ġbitmap Bytes . size , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġcompute Ġscale Ġratio ĊĊĠĠĠĠ Ġ* Ġ@ param Ġreq Width Ġ è¿ĻéĩĮ çļĦ req width Ġreq Height ĠéľĢè¦ģ åİĭç¼© åĪ°çļĦ å° º å¯ ¸ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalculate In Sample Size ( options : ĠBitmap Factory . Options , Ġreq Width : ĠInt , Ġreq Height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial In Sample Size Ġ= Ġcompute Initial Sample Size ( options , Ġreq Width , Ġreq Height ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġrounded In Sample Size : ĠInt ĊĠĠĠĠĠĠĠ Ġif Ġ( initial In Sample Size Ġ<= Ġ 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrounded In Sample Size Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rounded In Sample Size Ġ< Ġinitial In Sample Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShift Ġone Ġbit Ġto Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrounded In Sample Size Ġ= Ġrounded In Sample Size Ġshl Ġ 1 Ġ// Ġrounded Sample Size Ġ= Ġround Sample Ġ* Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrounded In Sample Size Ġ= Ġ( initial In Sample Size Ġ+ Ġ 7 ) Ġ/ Ġ 8 Ġ* Ġ 8 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrounded In Sample Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcompute Initial Sample Size ( options : ĠBitmap Factory . Options , Ġreq Width : ĠInt , Ġreq Height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRaw Ġheight Ġand Ġwidth Ġof Ġimage ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġoptions . out Height . toDouble () ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġoptions . out Width . toDouble () ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Num Of Pixels Ġ= Ġ( req Width Ġ* Ġreq Height ). to Long () ĊĠĠĠĠĠĠĠ Ġval Ġmin Side Length Ġ= ĠMath . min ( req Height , Ġreq Width ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlower Bound Ġ= Ġif Ġ( max Num Of Pixels Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . ceil ( Math . sqrt ( width Ġ* Ġheight Ġ/ Ġmax Num Of Pixels )). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġupper Bound Ġ= Ġif Ġ( min Side Length Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 8 ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMath . min ( Math . floor ( width Ġ/ Ġmin Side Length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . floor ( height Ġ/ Ġmin Side Length )). toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( upper Bound Ġ< Ġlower Bound ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġthe Ġlarger Ġone Ġwhen Ġthere Ġis Ġno Ġoverlapping Ġzone . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlower Bound ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( max Num Of Pixels Ġ< Ġ 0 Ġ&& Ġmin Side Length Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( min Side Length Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlower Bound ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġupper Bound ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ