8282
8383import org .w3c .dom .NamedNodeMap ;
8484import org .w3c .dom .Node ;
85+ import org .w3c .dom .NodeList ;
8586
8687import digilib .io .FileOpException ;
8788import digilib .io .FileOps ;
9495public class ImageLoaderDocuImage extends ImageInfoDocuImage {
9596
9697 /** DocuImage version */
97- public static final String version = "ImageLoaderDocuImage 2.3 .1" ;
98+ public static final String version = "ImageLoaderDocuImage 2.4 .1" ;
9899
99100 /** image object */
100101 protected BufferedImage img ;
@@ -132,8 +133,6 @@ protected static enum Hacks {
132133 needsRescaleRgba ,
133134 /** destination image type for LookupOp(mapBgrByteTable) needs to be (A)BGR */
134135 needsMapBgr ,
135- /** set destination type for blur operation */
136- forceDestForBlur ,
137136 /** set destination type for scale operation */
138137 forceDestForScaleCustom ,
139138 /** JPEG writer can't deal with RGBA */
@@ -146,7 +145,7 @@ protected static enum Hacks {
146145 force16BitTo8 ,
147146 /** convert images with 16 bit depth to sRGB (and 8 bit depth) */
148147 force16BitToSrgb8
149- }
148+ }
150149
151150 /** active hacks */
152151 protected static EnumMap <Hacks , Boolean > imageHacks = new EnumMap <Hacks , Boolean >(Hacks .class );
@@ -431,6 +430,7 @@ protected void changeRasterToSrgb(BufferedImage img, ICC_Profile realProfile) {
431430 * @return
432431 */
433432 protected BufferedImage changeTo8BitDepth (BufferedImage bi ) {
433+ // method suggested by Harald K in https://stackoverflow.com/a/74995441/4912
434434 ColorModel cm = bi .getColorModel ();
435435 ColorSpace cs = cm .getColorSpace ();
436436 boolean hasAlpha = cm .hasAlpha ();
@@ -487,17 +487,24 @@ public void setElem(int bank, int i, int val) {
487487 * @return
488488 */
489489 protected BufferedImage changeTo8BitNoAlpha (BufferedImage bi ) {
490+ BufferedImage newBi ;
490491 ColorModel cm = bi .getColorModel ();
491- int transferType = DataBuffer .TYPE_BYTE ;
492- ColorSpace newCs = cm .getColorSpace ();
493- ColorModel newCm = new ComponentColorModel (newCs , false , false , Transparency .OPAQUE , transferType );
494- WritableRaster newRaster = newCm .createCompatibleWritableRaster (bi .getWidth (), bi .getHeight ());
495- // use child Raster with only color components (bands 0,1,2)
496- final int [] colorBands = new int [] { 0 , 1 , 2 };
497- WritableRaster colorRaster = bi .getRaster ().createWritableChild (0 , 0 , bi .getWidth (), bi .getHeight (), 0 , 0 ,
498- colorBands );
499- BufferedImage newBi = new BufferedImage (newCm , newRaster , false , null );
500- newBi .setData (colorRaster );
492+ if (cm instanceof ComponentColorModel || cm instanceof DirectColorModel ) {
493+ ColorSpace newCs = cm .getColorSpace ();
494+ ColorModel newCm = new ComponentColorModel (newCs , false , false , Transparency .OPAQUE , DataBuffer .TYPE_BYTE );
495+ WritableRaster newRaster = newCm .createCompatibleWritableRaster (bi .getWidth (), bi .getHeight ());
496+ // use child Raster with only color components (bands 0,1,2)
497+ final int [] colorBands = new int [] { 0 , 1 , 2 };
498+ WritableRaster colorRaster = bi .getRaster ().createWritableChild (0 , 0 , bi .getWidth (), bi .getHeight (), 0 , 0 ,
499+ colorBands );
500+ newBi = new BufferedImage (newCm , newRaster , false , null );
501+ newBi .setData (colorRaster );
502+ } else {
503+ logger .debug ("changeTo8BitNonAlpha: converting to sRGB" );
504+ ColorConvertOp cco = new ColorConvertOp (ColorSpace .getInstance (ColorSpace .CS_sRGB ), renderHint );
505+ BufferedImage dest = new BufferedImage (bi .getWidth (), bi .getHeight (), BufferedImage .TYPE_INT_RGB );
506+ newBi = cco .filter (bi , dest );
507+ }
501508 return newBi ;
502509 }
503510
@@ -663,9 +670,10 @@ protected ICC_Profile getPngColorProfile(ImageReader reader) throws IOException
663670 ICC_Profile profile = null ;
664671 IIOMetadata meta = reader .getImageMetadata (0 );
665672 IIOMetadataNode dom = (IIOMetadataNode ) meta .getAsTree (meta .getNativeMetadataFormatName ());
666- IIOMetadataNode iccpNode = ( IIOMetadataNode ) dom .getElementsByTagName ("iCCP" ). item ( 0 );
667- if (iccpNode != null ) {
673+ NodeList iccpNodes = dom .getElementsByTagName ("iCCP" );
674+ if (iccpNodes . getLength () > 0 ) {
668675 logger .debug ("extracting iCCP profile from PNG." );
676+ IIOMetadataNode iccpNode = (IIOMetadataNode ) iccpNodes .item (0 );
669677 NamedNodeMap atts = iccpNode .getAttributes ();
670678 //String name = atts.getNamedItem("profileName").getNodeValue();
671679 String compression = atts .getNamedItem ("compressionMethod" ).getNodeValue ();
@@ -740,7 +748,7 @@ public void loadSubimage(ImageInput ii, Rectangle region, int prescale) throws F
740748 cm = img .getColorModel ();
741749 cs = cm .getColorSpace ();
742750 } catch (Exception e ) {
743- logger .warn ("Converting image to 8bit failed! Trying to convert to sRGB: {}" , e );
751+ logger .warn ("Converting image to 8bit failed! Trying to convert to sRGB: {}" , e . toString () );
744752 convertToSrgb = true ;
745753 }
746754 }
0 commit comments