@@ -114,28 +114,35 @@ impl IconElement {
114114 Encoding :: JP2PNG => {
115115 let image: Image ;
116116 if self . data . starts_with ( & JPEG_2000_FILE_MAGIC_NUMBER ) {
117- let bytes = & self . data [ 12 ..] ;
118- let codec = jp2k:: Codec :: jp2 ( ) ;
119- let stream = jp2k:: Stream :: from_bytes ( bytes) . unwrap ( ) ;
117+ let j2k_image = match jpeg2k:: Image :: from_bytes ( & self . data ) {
118+ Ok ( image) => image,
119+ Err ( e) => {
120+ return Err ( io:: Error :: new (
121+ io:: ErrorKind :: InvalidData ,
122+ e,
123+ ) )
124+ }
125+ } ;
126+ let alpha_default = 255u8 ; // Full opacity
127+ let pixels =
128+ j2k_image. get_pixels ( Some ( alpha_default) ) . map_err (
129+ |e| io:: Error :: new ( io:: ErrorKind :: InvalidData , e) ,
130+ ) ?;
120131
121- let jp2k :: ImageBuffer { buffer , width , height , num_bands } = jp2k :: ImageBuffer :: build (
122- codec ,
123- stream ,
124- jp2k :: DecodeParams :: default ( ) . with_reduce_factor ( 1 ) ,
125- )
126- . unwrap ( ) ;
132+ let pixel_format = match pixels . format {
133+ jpeg2k :: ImageFormat :: L8 => PixelFormat :: Gray ,
134+ jpeg2k :: ImageFormat :: La8 => PixelFormat :: GrayAlpha ,
135+ jpeg2k :: ImageFormat :: Rgb8 => PixelFormat :: RGB ,
136+ jpeg2k :: ImageFormat :: Rgba8 => PixelFormat :: RGBA ,
137+ } ;
127138
128- let image_rip = rips:: Image :: from_memory (
129- buffer,
130- width as i32 ,
131- height as i32 ,
132- num_bands as i32 ,
133- rips:: VipsBandFormat :: VIPS_FORMAT_UCHAR ,
134- )
135- . unwrap ( ) ;
136- image = Image :: read_png ( io:: Cursor :: new ( image_rip. to_bytes ( ) ) ) . unwrap ( )
137-
138- } else {
139+ image = Image :: from_data (
140+ pixel_format,
141+ pixels. width ,
142+ pixels. height ,
143+ pixels. data ,
144+ ) ?;
145+ } else {
139146 image = Image :: read_png ( io:: Cursor :: new ( & self . data ) ) ?;
140147 }
141148
0 commit comments