package Ġcom . f ak hr ul asa . sco per Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . graphics .* Ċ import Ġandroid . net . Uri Ċ import Ġjava . io . File Ċ Ċ fun Ġdecode Resource ( ĊĠĠĠ Ġres : ĠResources , ĊĠĠĠ Ġres Id : ĠInt , ĊĠĠĠ Ġdst Width : ĠInt , ĊĠĠĠ Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠ ĠBitmap Factory . decode Resource ( res , Ġres Id , Ġoptions ) ĊĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse ĊĠĠĠ Ġoptions . in Sample Size Ġ= Ġcalculate Sample Size ( ĊĠĠĠĠĠĠĠ Ġoptions . out Width , Ġoptions . out Height , Ġdst Width , ĊĠĠĠĠĠĠĠ Ġdst Height , Ġscaling Logic ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn ĠBitmap Factory . decode Resource ( res , Ġres Id , Ġoptions ) Ċ } Ċ Ċ fun Ġdecode File ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġuri : ĠUri , ĊĠĠĠ Ġdst Width : ĠInt , ĊĠĠĠ Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠBitmap ? Ġ{ ĊĠĠĠ Ġval Ġoptions Ġ= ĠBitmap Factory . Options () ĊĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠ Ġcontext . get Bitmap From Uri ( uri , Ġoptions ) ĊĠĠĠ Ġoptions . in Just Decode Bounds Ġ= Ġfalse ĊĊĠĠĠ Ġoptions . in Sample Size Ġ= Ġcalculate Sample Size ( ĊĠĠĠĠĠĠĠ Ġoptions . out Width , ĊĠĠĠĠĠĠĠ Ġoptions . out Height , ĊĠĠĠĠĠĠĠ Ġdst Width , ĊĠĠĠĠĠĠĠ Ġdst Height , ĊĠĠĠĠĠĠĠ Ġscaling Logic ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġreturn Ġcontext . get Bitmap From Uri ( uri , Ġoptions ) Ċ } ĊĊ Ċ fun Ġcreate Scaled Bitmap ( ĊĠĠĠ Ġun scaled Bitmap : ĠBitmap , Ġdst Width : ĠInt , Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġsrc Rect Ġ= Ġcalculate Src Rect ( ĊĠĠĠĠĠĠĠ Ġun scaled Bitmap . width , Ġun scaled Bitmap . height , ĊĠĠĠĠĠĠĠ Ġdst Width , Ġdst Height , Ġscaling Logic ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġdst Rect Ġ= Ġcalculate Dst Rect ( ĊĠĠĠĠĠĠĠ Ġun scaled Bitmap . width , ĊĠĠĠĠĠĠĠ Ġun scaled Bitmap . height , ĊĠĠĠĠĠĠĠ Ġdst Width , ĊĠĠĠĠĠĠĠ Ġdst Height , ĊĠĠĠĠĠĠĠ Ġscaling Logic ĊĠĠĠ Ġ) ĊĠĠĠ Ġval Ġscaled Bitmap Ġ= ĊĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( dst Rect . width (), Ġdst Rect . height (), ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( scaled Bitmap ) ĊĠĠĠ Ġcanvas . draw Bitmap ( un scaled Bitmap , Ġsrc Rect , Ġdst Rect , ĠPaint ( Paint . FILTER _ BITMAP _ FLAG )) ĊĊĠĠĠ Ġreturn Ġscaled Bitmap Ċ } ĊĊ Ċ enum Ġclass ĠScaling Logic Ġ{ ĊĠĠĠ ĠC ROP , ĠF IT Ċ } ĊĊ Ċ fun Ġcalculate Sample Size ( ĊĠĠĠ Ġsrc Width : ĠInt , Ġsrc Height : ĠInt , Ġdst Width : ĠInt , Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠInt Ġ{ ĊĠĠĠ Ġif Ġ( scaling Logic Ġ== ĠScaling Logic . FIT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Aspect Ġ= Ġsrc Width . toFloat () Ġ/ Ġsrc Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdst Aspect Ġ= Ġdst Width . toFloat () Ġ/ Ġdst Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( src Aspect Ġ> Ġdst Aspect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Width Ġ/ Ġdst Width ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Height Ġ/ Ġdst Height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Aspect Ġ= Ġsrc Width . toFloat () Ġ/ Ġsrc Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdst Aspect Ġ= Ġdst Width . toFloat () Ġ/ Ġdst Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( src Aspect Ġ> Ġdst Aspect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Height Ġ/ Ġdst Height ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Width Ġ/ Ġdst Width ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcalculate Src Rect ( ĊĠĠĠ Ġsrc Width : ĠInt , Ġsrc Height : ĠInt , Ġdst Width : ĠInt , Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠRect Ġ{ ĊĠĠĠ Ġif Ġ( scaling Logic Ġ== ĠScaling Logic . C ROP ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Aspect Ġ= Ġsrc Width . toFloat () Ġ/ Ġsrc Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdst Aspect Ġ= Ġdst Width . toFloat () Ġ/ Ġdst Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( src Aspect Ġ> Ġdst Aspect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Rect Width Ġ= Ġ( src Height Ġ* Ġdst Aspect ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Rect Left Ġ= Ġ( src Width Ġ- Ġsrc Rect Width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( src Rect Left , Ġ 0 , Ġsrc Rect Left Ġ+ Ġsrc Rect Width , Ġsrc Height ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Rect Height Ġ= Ġ( src Width Ġ/ Ġdst Aspect ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscr Rect Top Ġ= Ġ( src Height Ġ- Ġsrc Rect Height ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġscr Rect Top , Ġsrc Width , Ġscr Rect Top Ġ+ Ġsrc Rect Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRect ( 0 , Ġ 0 , Ġsrc Width , Ġsrc Height ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġcalculate Dst Rect ( ĊĠĠĠ Ġsrc Width : ĠInt , Ġsrc Height : ĠInt , Ġdst Width : ĠInt , Ġdst Height : ĠInt , ĊĠĠĠ Ġscaling Logic : ĠScaling Logic Ċ ): ĠRect Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( scaling Logic Ġ== ĠScaling Logic . FIT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsrc Aspect Ġ= Ġsrc Width . toFloat () Ġ/ Ġsrc Height . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġdst Aspect Ġ= Ġdst Width . toFloat () Ġ/ Ġdst Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( src Aspect Ġ> Ġdst Aspect ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , Ġdst Width , Ġ( dst Width Ġ/ Ġsrc Aspect ). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , Ġ( dst Height Ġ* Ġsrc Aspect ). toInt (), Ġdst Height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠRect ( 0 , Ġ 0 , Ġdst Width , Ġdst Height ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠgetImage Quality Percent ( file : ĠFile ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġsize InBytes Ġ= Ġfile . length () ĊĠĠĠ Ġval Ġsize In KB Ġ= Ġsize InBytes Ġ/ Ġ 1 0 2 4 ĊĠĠĠ Ġval Ġsize In MB Ġ= Ġsize In KB Ġ/ Ġ 1 0 2 4 ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġsize In MB Ġ<= Ġ 1 Ġ-> Ġ 8 0 ĊĠĠĠĠĠĠĠ Ġsize In MB Ġ<= Ġ 2 Ġ-> Ġ 6 0 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 4 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠContext . getImage H gt W dt ( uri : ĠUri ): ĠPair < Int , ĠInt > Ġ{ ĊĠĠĠ Ġval Ġopt Ġ= ĠBitmap Factory . Options () ĊĊĠĠĠ Ġ/* Ġby Ġsetting Ġthis Ġfield Ġas Ġtrue , Ġthe Ġactual Ġbitmap Ġpixels Ġare Ġnot Ġloaded Ġin Ġthe Ġmemory . ĠJust Ġthe Ġbounds Ġare Ġloaded . ĊĠĠĠ ĠIf Ġyou Ġtry Ġthe Ġuse Ġthe Ġbitmap Ġhere , Ġyou Ġwill Ġget Ġnull .*/ ĊĠĠĠ Ġopt . in Just Decode Bounds Ġ= Ġtrue ĊĠĠĠ Ġval Ġbm Ġ= Ġget Bitmap From Uri ( uri , Ġopt ) ĊĊĠĠĠ Ġvar Ġactual H gt Ġ= Ġ( opt . out Height ). toFloat () ĊĠĠĠ Ġvar Ġactual W dt Ġ= Ġ( opt . out Width ). toFloat () ĊĊĠĠĠ Ġ/* val ĠmaxHeight Ġ= Ġ 8 1 6 . 0 f ĊĠĠĠ Ġval ĠmaxWidth Ġ= Ġ 6 1 2 . 0 f */ ĊĠĠĠ Ġval ĠmaxHeight Ġ= Ġ 7 2 0 f ĊĠĠĠ Ġval ĠmaxWidth Ġ= Ġ 1 2 8 0 f ĊĠĠĠ Ġvar Ġimg Ratio Ġ= Ġactual W dt Ġ/ Ġactual H gt ĊĠĠĠ Ġval Ġmax Ratio Ġ= ĠmaxWidth Ġ/ ĠmaxHeight Ċ Ċ // ĠĠĠ Ġwidth Ġand Ġheight Ġvalues Ġare Ġset Ġmaintaining Ġthe Ġaspect Ġratio Ġof Ġthe Ġimage ĊĠĠĠ Ġif Ġ( actual H gt Ġ> ĠmaxHeight Ġ|| Ġactual W dt Ġ> ĠmaxWidth ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ< Ġmax Ratio Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ= ĠmaxHeight Ġ/ Ġactual H gt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual W dt Ġ= Ġ( img Ratio Ġ* Ġactual W dt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual H gt Ġ= ĠmaxHeight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ> Ġmax Ratio Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimg Ratio Ġ= ĠmaxWidth Ġ/ Ġactual W dt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual H gt Ġ= Ġ( img Ratio Ġ* Ġactual H gt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual W dt Ġ= ĠmaxWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual H gt Ġ= ĠmaxHeight ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual W dt Ġ= ĠmaxWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠPair ( actual H gt . toInt (), Ġactual W dt . toInt ()) Ċ }