package Ġcom . phil ip g ur r . smart shopping list . util . extensions Ċ Ċ import Ġandroid . graphics .* Ċ import Ġandroid . media . Image Ċ import Ġandroidx . camera . core . Image Proxy Ċ import Ġjava . io . ByteArray OutputStream Ċ Ċ fun ĠImage . to Bitmap (): ĠBitmap Ġ{ ĊĠĠĠ Ġval Ġy Buffer Ġ= Ġplanes [ 0 ]. buffer ĊĠĠĠ Ġval Ġu Buffer Ġ= Ġplanes [ 1 ]. buffer ĊĠĠĠ Ġval Ġv Buffer Ġ= Ġplanes [ 2 ]. buffer ĊĊĠĠĠ Ġval Ġy Size Ġ= Ġy Buffer . remaining () ĊĠĠĠ Ġval Ġu Size Ġ= Ġu Buffer . remaining () ĊĠĠĠ Ġval Ġv Size Ġ= Ġv Buffer . remaining () ĊĊĠĠĠ Ġval Ġnv 2 1 Ġ= ĠByteArray ( y Size Ġ+ Ġu Size Ġ+ Ġv Size ) ĊĊĠĠĠ Ġy Buffer . get ( nv 2 1 , Ġ 0 , Ġy Size ) ĊĠĠĠ Ġv Buffer . get ( nv 2 1 , Ġy Size , Ġv Size ) ĊĠĠĠ Ġu Buffer . get ( nv 2 1 , Ġy Size Ġ+ Ġv Size , Ġu Size ) ĊĊĠĠĠ Ġval Ġy uv Image Ġ= ĠY uv Image ( nv 2 1 , ĠImage Format . NV 2 1 , Ġthis . width , Ġthis . height , Ġnull ) ĊĠĠĠ Ġval Ġout Ġ= ĠByteArrayOutputStream () ĊĠĠĠ Ġy uv Image . compress To J peg ( Rect ( 0 , Ġ 0 , Ġy uv Image . width , Ġy uv Image . height ), Ġ 5 0 , Ġout ) ĊĠĠĠ Ġval Ġimage Bytes Ġ= Ġout . toByteArray () ĊĠĠĠ Ġreturn ĠBitmap Factory . decode ByteArray ( image Bytes , Ġ 0 , Ġimage Bytes . size ) Ċ } Ċ Ċ fun ĠY UV _ 4 2 0 _ 8 8 8 to NV 2 1 ( image : ĠImage Proxy ): ĠByteArray Ġ{ ĊĊĠĠĠ Ġval Ġwidth Ġ= Ġimage . width ĊĠĠĠ Ġval Ġheight Ġ= Ġimage . height ĊĠĠĠ Ġval Ġy Size Ġ= Ġwidth Ġ* Ġheight ĊĠĠĠ Ġval Ġuv Size Ġ= Ġwidth Ġ* Ġheight Ġ/ Ġ 4 ĊĊĠĠĠ Ġval Ġnv 2 1 Ġ= ĠByteArray ( y Size Ġ+ Ġuv Size Ġ* Ġ 2 ) ĊĠĠĠ Ġval Ġy Buffer Ġ= Ġimage . planes [ 0 ]. buffer ĊĠĠĠ Ġval Ġu Buffer Ġ= Ġimage . planes [ 1 ]. buffer ĊĠĠĠ Ġval Ġv Buffer Ġ= Ġimage . planes [ 2 ]. buffer ĊĊĠĠĠ Ġvar Ġrow Stride Ġ= Ġimage . planes [ 0 ]. row Stride ĊĠĠĠ Ġassert ( image . planes [ 0 ]. pixel Stride Ġ== Ġ 1 ) ĊĊĠĠĠ Ġvar Ġpos Ġ= Ġ 0 ĊĊĠĠĠ Ġif Ġ( row Stride Ġ== Ġwidth ) Ġ{ ĊĠĠĠĠĠĠĠ Ġy Buffer . get ( nv 2 1 , Ġ 0 , Ġy Size ) ĊĠĠĠĠĠĠĠ Ġpos Ġ+= Ġy Size ĊĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġy Buffer Pos Ġ= Ġ( width Ġ- Ġrow Stride ). to Long () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( pos Ġ< Ġy Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Buffer Pos Ġ= Ġy Buffer Pos Ġ+ Ġ( row Stride Ġ- Ġwidth ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Buffer . position ( y Buffer Pos . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy Buffer . get ( nv 2 1 , Ġpos , Ġwidth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġwidth ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrow Stride Ġ= Ġimage . planes [ 2 ]. row Stride ĊĠĠĠ Ġval Ġpixel Stride Ġ= Ġimage . planes [ 2 ]. pixel Stride ĊĊĠĠĠ Ġassert ( row Stride Ġ== Ġimage . planes [ 1 ]. row Stride ) ĊĠĠĠ Ġassert ( pixel Stride Ġ== Ġimage . planes [ 1 ]. pixel Stride ) ĊĊĠĠĠ Ġif Ġ( pixel Stride Ġ== Ġ 2 Ġ&& Ġrow Stride Ġ== Ġwidth Ġ&& Ġu Buffer . get ( 0 ) Ġ== Ġv Buffer . get ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsave Pixel Ġ= Ġv Buffer . get ( 1 ) ĊĠĠĠĠĠĠĠ Ġv Buffer . put ( 1 , Ġ 0 . to Byte ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( u Buffer . get ( 0 ). toInt () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Buffer . put ( 1 , Ġ 2 5 5 . to Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( u Buffer . get ( 0 ). toInt () Ġ== Ġ 2 5 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Buffer . put ( 1 , Ġsave Pixel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Buffer . get ( nv 2 1 , Ġy Size , Ġuv Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnv 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġv Buffer . put ( 1 , Ġsave Pixel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġheight Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( col Ġin Ġ 0 Ġuntil Ġwidth Ġ/ Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv u Pos Ġ= Ġcol Ġ* Ġpixel Stride Ġ+ Ġrow Ġ* Ġrow Stride ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnv 2 1 [ pos ++] Ġ= Ġv Buffer . get ( vu Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnv 2 1 [ pos ++] Ġ= Ġu Buffer . get ( vu Pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnv 2 1 Ċ }