package Ġcom . coding . viewModel Ċ Ċ import Ġjavafx . beans . property . Simple ObjectProperty Ċ import Ġjavafx . scene . image . Image Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ Ċ class ĠThird Scenario ViewModel Ġ: ĠProcessing ViewModel < Image >() Ġ{ ĊĊĠĠĠ Ġ// ĠStores Ġthe Ġimage Ġfile Ġselected Ġby Ġuser Ġin Ġfile Ġdialog ĊĠĠĠ Ġval Ġimage File Ġ= ĠSimple ObjectProperty < File >() ĊĊĠĠĠ Ġ// ĠHeader Ġinfo Ġof Ġbmp Ġimage , Ġwhich Ġis Ġnot Ġsent Ġthrough Ġchannel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġheader Info : ĠByteArray ĊĊĠĠĠ Ġ// ĠPro cesses Ġthe Ġimage . ĠIt Ġprocesses Ġthe Ġimage Ġboth Ġways : Ġby Ġencoding / de coding , Ġand Ġnot Ġcoding Ġit Ġat Ġall . ĊĠĠĠ Ġfun Ġprocess Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage ByteArray Without Header Ġ= Ġset Header Info And Original Data () ĊĠĠĠĠĠĠĠ Ġval Ġimage Binary String Ġ= Ġbytes To Binary String ( image ByteArray Without Header ) ĊĠĠĠĠĠĠĠ Ġval Ġbinary Vectors Ġ= Ġbinary StringTo Binary Vectors ( image Binary String ) ĊĠĠĠĠĠĠĠ Ġval Ġfrom Channel Message Vectors Ġ= Ġbinary Vectors . map Ġ{ Ġchannel . send ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġnot Coded Processed Data . set ( binary Vector sTo Image ( from Channel Message Vectors )) ĊĊĠĠĠĠĠĠĠ Ġval Ġencoded Binary Vectors Ġ= Ġbinary Vectors . map Ġ{ Ġencoder . encode ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġencoded From Channel Binary Vectors Ġ= Ġencoded Binary Vectors . map Ġ{ Ġchannel . send ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdecoded Binary Vectors Ġ= Ġencoded From Channel Binary Vectors . map Ġ{ Ġdecoder . decode ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġcoded Processed Data . set ( binary Vector sTo Image ( decoded Binary Vectors )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSave Ġthe Ġimage 's Ġheader Ġinfo , Ġsave Ġthe Ġoriginal Ġimage Ġas Ġjavafx ĠImage Ġto Ġoriginal Data Ġproperty . ĊĠĠĠ Ġ// ĠReturns Ġthe Ġbyte Ġarray Ġwithout Ġheader Ġinfo ĊĠĠĠ Ġprivate Ġfun Ġset Header Info And Original Data (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage ByteArray : ĠByteArray ĊĠĠĠĠĠĠĠ ĠFileInputStream ( image File . value ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage ByteArray Ġ= Ġit . read Bytes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠByteArrayInputStream ( image ByteArray ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Data . set ( Image ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġheader Info Ġ= Ġimage ByteArray . take ( B MP _ HEADER _ SIZE _ IN _ BYTES ). toByteArray () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimage ByteArray . drop ( B MP _ HEADER _ SIZE _ IN _ BYTES ). toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠConverts Ġbinary Ġmessage Ġvectors Ġto Ġjavafx ĠImage . ĠFirst Ġit Ġconverts Ġthe Ġvectors Ġto Ġbytes . ĊĠĠĠ Ġ// ĠThen , Ġit Ġadds Ġthe Ġheader Ġinfo Ġto Ġbeginning Ġof Ġthe Ġbyte Ġarray Ġand Ġlast ly , Ġusing Ġbyte Ġarray Ġinput Ġstream Ġit ĊĠĠĠ Ġ// Ġgenerates Ġthe Ġjavafx ĠImage Ġobject . ĊĠĠĠ Ġ// ĠArguments : Ġlist Ġof Ġbinary Ġmessage Ġvectors ĊĠĠĠ Ġ// ĠReturns : Ġjavafx ĠImage Ġobject ĊĠĠĠ Ġprivate Ġfun Ġbinary Vector sTo Image ( binary Vectors : ĠList < List < Int >> ): ĠImage Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġbinary Vector sTo Bytes ( binary Vectors ). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes With Header Ġ= Ġheader Info . to Mutable List () ĊĠĠĠĠĠĠĠ Ġbytes With Header . addAll ( bytes ) ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġbytes With Header . toByteArray () ĊĊĠĠĠĠĠĠĠ ĠByteArrayInputStream ( byteArray ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠImage ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠB MP _ HEADER _ SIZE _ IN _ BYTES Ġ= Ġ 5 4 ĊĠĠĠ Ġ} Ċ } Ċ