package Ġio . face . mask . detection Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . media . Image Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . content . res . AppCompat Resources Ċ import Ġandroidx . camera . core .* Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġio . face . mask . detection . ml . F ack Mask Detection Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . tensorflow . lite . support . image . Tensor Image Ċ import Ġorg . tensorflow . lite . support . label . Category Ċ import Ġorg . tensorflow . lite . support . model . Model Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ type alias ĠCamera Bitmap Output Listener Ġ= Ġ( bitmap : ĠBitmap ) Ġ-> ĠUnit Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity ( R . layout . activity _ main ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġpreview : ĠPreview ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġimage Analyzer : ĠImage Analysis ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcamera Provider : ĠProcess Camera Provider ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlens Facing : ĠInt Ġ= ĠCamera Selector . LEN S _ F ACING _ FRONT ĊĊĠĠĠ Ġprivate Ġvar Ġcamera : ĠCamera ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Executor : ĠExecutor Service ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup ML () ĊĊĠĠĠĠĠĠĠ Ġsetup Camera Thread () ĊĠĠĠĠĠĠĠ Ġsetup Camera Controllers () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! all Permissions Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Camera Permission () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Camera Thread () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Camera Controllers () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġset Lens Button Icon () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ camera _ lens _ face . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Resources . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lens Facing Ġ== ĠCamera Selector . LEN S _ F ACING _ FRONT ) ĠR . drawable . ic _ camera _ rear Ġelse ĠR . drawable . ic _ camera _ front ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Lens Button Icon () ĊĊĠĠĠĠĠĠĠ Ġbtn _ camera _ lens _ face . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlens Facing Ġ= Ġif Ġ( Camera Selector . LEN S _ F ACING _ FRONT Ġ== Ġlens Facing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . LEN S _ F ACING _ BACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . LEN S _ F ACING _ FRONT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Lens Button Icon () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Camera Use Cases () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ camera _ lens _ face . isEnabled Ġ= Ġhas Back Camera Ġ&& Ġhas Front Camera ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠCamera Info Unavailable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn _ camera _ lens _ face . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġrequire Camera Permission () Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠREQUIRED _ PERMISSION S , ĠREQUEST _ CODE _ PERMISSION S ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgranted Camera Permission ( request Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CODE _ PERMISSION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Permissions Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permissions Ġnot Ġgranted Ġby Ġthe Ġuser .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup Camera Use Cases () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLens - facing Ġselector ĊĠĠĠĠĠĠĠ Ġval Ġcamera Selector : ĠCamera Selector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . Builder (). require Lens Facing ( lens Facing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCamera Ġpreview ĊĠĠĠĠĠĠĠ Ġval Ġmetrics : ĠDisplay Metrics Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDisplay Metrics (). also Ġ{ Ġpreview _ view . display . get Real Metrics ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrotation : ĠInt Ġ= Ġpreview _ view . display . rotation ĊĠĠĠĠĠĠĠ Ġval Ġscreen AspectRatio : ĠInt Ġ= Ġaspect Ratio ( metrics . width Pixels , Ġmetrics . height Pixels ) ĊĠĠĠĠĠĠĠ Ġpreview Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget AspectRatio ( screen AspectRatio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠImage Analysis ĊĠĠĠĠĠĠĠ Ġimage Analyzer Ġ= ĠImage Analysis . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget AspectRatio ( screen AspectRatio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Analyzer ( camera Executor , ĠBitmap Output Analysis ( application Context ) Ġ{ Ġbitmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup M LO ut put ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠU nb ind Ġlast Ġbinding ĊĠĠĠĠĠĠĠ Ġcamera Provider ?. unbind All () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBinding Ġthis Ġtime ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġcamera Provider ?. bind To Lifecycle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġcamera Selector , Ġpreview , Ġimage Analyzer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ?. set Surface Provider ( preview _ view . create Surface Provider ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Use Ġcase Ġbinding Ġfailed ", Ġexc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġsetup Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future : ĠList enable Future < Process Camera Provider > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Camera Provider . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider Ġ= Ġcamera Provider Future . get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlens Facing Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Front Camera Ġ-> ĠCamera Selector . LEN S _ F ACING _ FRONT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Back Camera Ġ-> ĠCamera Selector . LEN S _ F ACING _ BACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" No Ġcameras Ġon Ġthis Ġdevices ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Camera Controllers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Camera Use Cases () ĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġall Permissions Granted : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠREQUIRED _ PERMISSION S . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Context , Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĊĠĠĠĠĠĠĠ ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgranted Camera Permission ( request Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ Ġsetup Camera Controllers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhas Back Camera : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcamera Provider ?. has Camera ( Camera Selector . DEFAULT _ BACK _ CAMERA ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhas Front Camera : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcamera Provider ?. has Camera ( Camera Selector . DEFAULT _ FRONT _ CAMERA ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaspect Ratio ( width : ĠInt , Ġheight : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreview Ratio : ĠDouble Ġ= Ġmax ( width , Ġheight ). toDouble () Ġ/ Ġmin ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġif Ġ( abs ( preview Ratio Ġ- ĠR AT IO _ 4 _ 3 _ VALUE ) Ġ<= Ġabs ( preview Ratio Ġ- ĠR AT IO _ 1 6 _ 9 _ VALUE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAs pect Ratio . RATIO _ 4 _ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAs pect Ratio . RATIO _ 1 6 _ 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġface Mask Detection : ĠF ack Mask Detection ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ML () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions : ĠModel . Options Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModel . Options . Builder (). set Device ( Model . Device . GPU ). set Num Threads ( 5 ). build () ĊĠĠĠĠĠĠĠ Ġface Mask Detection Ġ= ĠF ack Mask Detection . newInstance ( application Context , Ġoptions ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup M LO ut put ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtensor Image : ĠTensor Image Ġ= ĠTensor Image . from Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠF ack Mask Detection . Outputs Ġ= Ġface Mask Detection . process ( tensor Image ) ĊĠĠĠĠĠĠĠ Ġval Ġoutput : ĠList < Category > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . probability As Category List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsortBy Descending Ġ{ Ġres Ġ-> Ġres . score Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . first OrNull ()?. let Ġ{ Ġcategory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ output . text Ġ= Ġcategory . label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ output . setTextColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category . label Ġ== Ġ" without _ mask ") ĠR . color . red Ġelse ĠR . color . green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay . background Ġ= Ġget Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category . label Ġ== Ġ" without _ mask ") ĠR . drawable . red _ border Ġelse ĠR . drawable . green _ border ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb _ output . progress Tint List Ġ= ĠAppCompat Resources . getColor State List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( category . label Ġ== Ġ" without _ mask ") ĠR . color . red Ġelse ĠR . color . green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb _ output . progress Ġ= Ġ( category . score Ġ* Ġ 1 0 0 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Face - Mask - Detection " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CODE _ PERMISSION S Ġ= Ġ 0 x 9 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S : ĠArray < String > Ġ= ĠarrayOf ( Manifest . permission . CAMERA ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR AT IO _ 4 _ 3 _ VALUE : ĠDouble Ġ= Ġ 4 . 0 Ġ/ Ġ 3 . 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠR AT IO _ 1 6 _ 9 _ VALUE : ĠDouble Ġ= Ġ 1 6 . 0 Ġ/ Ġ 9 . 0 ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠBitmap Output Analysis ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġlistener : ĠCamera Bitmap Output Listener Ċ ) Ġ: ĊĠĠĠ ĠImage Analysis . Analyzer Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġy uv To Rgb Converter Ġ= ĠY uv To Rgb Converter ( context ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbitmap Buffer : ĠBitmap ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrotation Matrix : ĠMatrix ĊĊĠĠĠ Ġ@ Suppress Lint (" Unsafe Experimental Usage Error ") ĊĠĠĠ Ġprivate Ġfun ĠImage Proxy . to Bitmap (): ĠBitmap ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimage : ĠImage Ġ= Ġthis . image Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! :: bitmap Buffer . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Matrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Matrix . post Rotate ( this . image Info . rotation Degrees . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Buffer Ġ= ĠBitmap . create Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . width , Ġthis . height , ĠBitmap . Config . ARGB _ 8 8 8 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġimage Ġto Ġan Ġimage Ġanaly ser ĊĠĠĠĠĠĠĠ Ġy uv To Rgb Converter . y uv To Rgb ( image , Ġbitmap Buffer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe ĠBitmap Ġin Ġthe Ġcorrect Ġorientation ĊĠĠĠĠĠĠĠ Ġreturn ĠBitmap . create Bitmap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Buffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Buffer . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Buffer . height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Matrix , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġanalyze ( image Proxy : ĠImage Proxy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġimage Proxy . to Bitmap ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage Proxy . close () ĊĠĠĠ Ġ} Ċ }