package Ġnl . png decoder . png Ċ Ċ import Ġpng . chunks . ID AT Ċ import Ġpng . chunks . IH DR Ċ import Ġpng . chunks . PL TE Ċ import Ġpng . chunks . HEAD Ċ import Ġjava . awt . image . Data Buffer Byte Ċ import Ġjava . awt . image . Raster Ċ import Ġjava . awt . image . Writable Raster Ċ import Ġjava . util . zip . CRC 3 2 Ċ import Ġjava . awt . image . Index Color Model Ċ import Ġjava . awt . image . Color Model Ċ import Ġjava . awt . image . Buffered Image Ċ import Ġnl . png decoder . constants . Color Type Ċ import Ġnl . png decoder . exceptions . Cor rupted PNG Exception Ċ import Ġnl . png decoder . exceptions . Invalid Header Exception Ċ import Ġnl . png decoder . exceptions . Unsupported Feature Exception Ċ import Ġnl . png decoder . png . models . PNG Image Ċ import Ġnl . png decoder . util . Byte Reader Ċ Ċ /** Ċ Ġ* ĠThe Ġmain Ġclass Ċ Ġ* ĠUse ĠPNG Reader . read P ng () Ġto Ġget Ġan ĠBufferedImage , Ġwhich Ġyou Ġcan Ġrender Ġhowever Ġyou Ġlike . Ċ Ġ*/ Ċ class ĠPNG Reader Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠcurrentIndex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġfirst Header Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfun Ġread P ng ( filename : ĠString ): ĠPNG Image Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByte Reader . readFile Into Buffer ( filename ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! HEAD . check Header ( bytes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Header Exception (" Can 't Ġread Ġfile , Ġinvalid Ġheader .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= ĠPNG Image () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Chunk ( bytes , Ġimage ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLast Ġfour Ġbytes Ġare Ġthe ĠCRC Ġof Ġthe ĠI END Ġchunk . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( currentIndex Ġ+ Ġ 4 Ġ!= Ġbytes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCor rupted PNG Exception (" Unexpected Ġend Ġof Ġfile !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġimage ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread Chunk ( bytes : ĠByteArray , Ġimage : ĠPNG Image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠByte Reader . read Bytes ToInt ( 4 , Ġbytes , ĠcurrentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= ĠByte Reader . read Bytes ToString ( 4 , Ġbytes , ĠcurrentIndex ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( first Header Ġ&& Ġtype Ġ!= Ġ" IH DR ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCor rupted PNG Exception (" First Ġheader Ġis Ġnot Ġa ĠI HDR ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Header Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("$ type : Ġ$ length ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" IH DR " Ġ-> ĠI HDR . read ( bytes , Ġimage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PL TE " Ġ-> ĠPL TE . read ( bytes , Ġimage , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ID AT " Ġ-> ĠID AT . read ( bytes , Ġimage , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" I END " Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠcurrentIndex Ġ+= Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif (! valid CRC ( bytes , Ġlength )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCor rupted PNG Exception (" CRC Ġis Ġnot Ġvalid !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Chunk ( bytes , Ġimage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġvalid CRC ( bytes : ĠByteArray , Ġlength : ĠInt ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchunk Data Ġ= ĠByte Reader . slice ( currentIndex Ġ- Ġlength Ġ- Ġ 4 , ĠcurrentIndex , Ġbytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpng CRC Ġ= ĠByte Reader . read Bytes ToInt ( 4 , Ġbytes , ĠcurrentIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc Ġ= ĠCRC 3 2 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrc . update ( chunk Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpng CRC Ġ== Ġcrc . value . toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ