package Ġcom . example . my application Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . media . Ex if Interface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Environment Ċ import Ġandroidx . core . content . File Provider Ċ import Ġjava . io .* Ċ Ċ class ĠImage Manager Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEXT ENSION Ġ: ĠString Ġ= Ġ". jpg " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ TEMP Ġ: ĠString Ġ= Ġ" camera _ photo ${ EXTENSION }" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFILE _ EXPORT Ġ: ĠString Ġ= Ġ" file _ export . jpg " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ QUAL ITY _ TO _ SAVE Ġ: ĠInt Ġ= Ġ 6 5 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ WIDTH _ TO _ SAVE Ġ: ĠFloat Ġ= Ġ 4 8 0 F ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ TEMP _ TO _ SAVE Ġ: ĠString Ġ= Ġ" resize _ camera _ photo ${ EXTENSION }" ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ QUAL ITY _ TO _ WORK Ġ Ġ: ĠInt Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠIMAGE _ WIDTH _ TO _ WORK Ġ: ĠFloat Ġ= Ġ 7 2 0 F ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext Ġ: ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdirectory Ġ: ĠFile ĊĠĠĠ Ġprivate Ġvar Ġimage File Ġ: ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġimage To Save Ġ: ĠString Ġ= Ġ"" ĊĊĊĠĠĠ Ġconstructor ( con : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . context Ġ= Ġcon ĊĠĠĠĠĠĠĠ Ġthis . directory Ġ= ĠFile ( this . context . get External Files Dir ( null ), ĠEnvironment . DIRECTORY _ PI CTURE S ) ĊĠĠĠĠĠĠĠ Ġthis . image File Ġ= Ġdirectory . absolute Path . toString () ĊĠĠĠĠĠĠĠ Ġthis . image File Ġ+= Ġ"/ ${ IMAGE _ TEMP }" ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġthis . image To Save Ġ= Ġdirectory . absolute Path . toString () ĊĠĠĠĠĠĠĠ Ġthis . image To Save Ġ+= Ġ"/ ${ IMAGE _ TEMP _ TO _ SAVE }" ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetImage To Save (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( this . image To Save ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetImage Path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . image File ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġis Save () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= ĠBitmap Factory . decode File ( image File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġresize Ġ( bitmap , ĠIMAGE _ WIDTH _ TO _ SAVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġpor trait Orientation ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( image To Save ). use Ġ{ Ġout Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , ĠIMAGE _ QUAL ITY _ TO _ SAVE , Ġout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Thumbnail () Ġ: ĠBitmap ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray OutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= ĠBitmap Factory . decode File ( image File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġresize ( bitmap , ĠIMAGE _ WIDTH _ TO _ SAVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap . compress ( Bitmap . Compress Format . JPEG , ĠIMAGE _ QUAL ITY _ TO _ SAVE , ĠbyteArray OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresize ( bitmap : ĠBitmap , Ġnew Width Ġ: ĠFloat ) Ġ: ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġbitmap . width ĊĠĠĠĠĠĠĠ Ġval Ġhe ig th Ġ= Ġbitmap . height ĊĠĠĠĠĠĠĠ Ġval Ġaspect Ratio Ġ: ĠFloat Ġ= Ġnew Width Ġ/ Ġwidth . toFloat () ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ> Ġnew Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Scaled Bitmap ( bitmap , Ġnew Width . toInt (), Ġ( he ig th . toFloat () Ġ* Ġaspect Ratio ). toInt (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġpor trait Orientation ( bitmap : ĠBitmap ) Ġ: ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġei Ġ: ĠEx if Interface Ġ= ĠEx if Interface ( this . image File ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ei . getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , ĠEx if Interface . OR IENTATION _ NORMAL )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 9 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate ( bitmap , Ġ 9 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 1 8 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate ( bitmap , Ġ 2 7 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ TRANS VERSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate ( bitmap , Ġ 2 7 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 2 7 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrotate ( bitmap , Ġ 2 7 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ FLI P _ HORIZONTAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflip ( bitmap , Ġtrue , Ġvertical Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ FLI P _ VERTICAL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġflip ( bitmap , Ġfalse , Ġvertical Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrotate ( bitmap Ġ: ĠBitmap , Ġde gress Ġ: ĠFloat ) Ġ: ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( de gress ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( bitmap , Ġ 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height , Ġmatrix , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip ( bitmap : ĠBitmap , Ġhorizontal Ġ: ĠBoolean , Ġvertical Ġ: ĠBoolean ) Ġ: ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġmatrix . pre Scale ( if ( horizontal ) Ġ(- 1 f ) Ġelse Ġ 1 f , Ġif Ġ( vertical ) Ġ(- 1 f ) Ġelse Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( bitmap , Ġ 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height , Ġmatrix , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Uri () Ġ: ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Uri From Path ( this . context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Uri From Path ( context : ĠContext ) Ġ: ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile Provider . get Uri For File ( context , Ġ"${ Build Config . APPLICATION _ ID }. file provider ", ĠFile ( this . image File )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Create Base Image File () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠFile ( image File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Base Directory Exist ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Base Directory Exist () Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( directory . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory . mkdir () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex Ġ: ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }