1 58 package org.krysalis.barcode.output.bitmap; 59 60 import java.awt.image.BufferedImage ; 61 import java.io.IOException ; 62 import java.io.OutputStream ; 63 import java.util.Iterator ; 64 65 import javax.imageio.IIOImage ; 66 import javax.imageio.ImageIO ; 67 import javax.imageio.ImageTypeSpecifier ; 68 import javax.imageio.ImageWriter ; 69 import javax.imageio.metadata.IIOMetadata ; 70 import javax.imageio.metadata.IIOMetadataNode ; 71 import javax.imageio.stream.ImageOutputStream ; 72 73 import org.krysalis.barcode.tools.DebugUtil; 74 import org.krysalis.barcode.tools.MimeTypes; 75 import org.krysalis.barcode.tools.UnitConv; 76 77 82 public class ImageIOBitmapEncoder implements BitmapEncoder { 83 84 90 public ImageIOBitmapEncoder() throws ClassNotFoundException { 91 Class.forName("javax.imageio.ImageIO"); 92 } 93 94 95 public String [] getSupportedMIMETypes() { 96 return ImageIO.getWriterMIMETypes(); 97 } 98 99 100 public void encode(BufferedImage image, OutputStream out, 101 String mime, int resolution) throws IOException { 102 103 Iterator i = ImageIO.getImageWritersByMIMEType(mime); 105 ImageWriter writer = (ImageWriter )i.next(); 106 107 ImageOutputStream imout = ImageIO.createImageOutputStream(out); 109 writer.setOutput(imout); 110 111 IIOMetadata iiometa = setupMetadata(image, writer, mime, resolution); 113 114 IIOImage iioimage = new IIOImage (image, null, iiometa); 116 writer.write(iioimage); 117 writer.dispose(); 118 imout.close(); 119 } 120 121 private IIOMetadata setupMetadata(BufferedImage image, ImageWriter writer, 122 String mime, int resolution) throws IOException { 123 IIOMetadata iiometa = writer.getDefaultImageMetadata( 124 new ImageTypeSpecifier (image), 125 writer.getDefaultWriteParam()); 126 if (iiometa == null) return null; 128 132 final String stdmeta = "javax_imageio_1.0"; 133 final String jpegmeta = "javax_imageio_jpeg_image_1.0"; 134 135 if (MimeTypes.MIME_JPEG.equals(mime) 136 && jpegmeta.equals(iiometa.getNativeMetadataFormatName())) { 137 138 142 143 checkWritable(iiometa); 144 145 IIOMetadataNode rootnode = (IIOMetadataNode )iiometa.getAsTree(jpegmeta); 146 IIOMetadataNode variety = (IIOMetadataNode )rootnode. 147 getElementsByTagName("JPEGvariety").item(0); 148 149 IIOMetadataNode jfif = (IIOMetadataNode )variety. 150 getElementsByTagName("app0JFIF").item(0); 151 jfif.setAttribute("resUnits", "1"); jfif.setAttribute("Xdensity", Integer.toString(resolution)); 153 jfif.setAttribute("Ydensity", Integer.toString(resolution)); 154 155 158 iiometa.setFromTree(jpegmeta, rootnode); 159 160 162 } else if (iiometa.isStandardMetadataFormatSupported()) { 163 checkWritable(iiometa); 164 165 IIOMetadataNode rootnode = new IIOMetadataNode (stdmeta); 166 167 IIOMetadataNode imagedim = new IIOMetadataNode ("Dimension"); 168 IIOMetadataNode child = new IIOMetadataNode ("HorizontalPixelSize"); 169 double effResolution = 1 / (UnitConv.in2mm(1) / resolution); 170 child.setAttribute("value", Double.toString(effResolution)); 171 imagedim.appendChild(child); 172 child = new IIOMetadataNode ("VerticalPixelSize"); 173 child.setAttribute("value", Double.toString(effResolution)); 174 imagedim.appendChild(child); 175 176 IIOMetadataNode textNode = new IIOMetadataNode ("Text"); 177 child = new IIOMetadataNode ("TextEntry"); 178 child.setAttribute("keyword", "Software"); 179 child.setAttribute("value", "Krysalis Barcode"); 180 child.setAttribute("encoding", "Unicode"); 181 child.setAttribute("language", "en"); 182 child.setAttribute("compression", "none"); 183 textNode.appendChild(child); 184 185 rootnode.appendChild(imagedim); 186 rootnode.appendChild(textNode); 187 188 191 iiometa.mergeTree(stdmeta, rootnode); 192 193 } 195 return iiometa; 196 } 197 198 private void checkWritable(IIOMetadata iiometa) throws IOException { 199 if (iiometa.isReadOnly()) { 200 throw new IOException ("Metadata is read-only. Cannot modify"); 202 } 203 } 204 205 private void dumpMetadata(IIOMetadata iiometa) { 206 String [] metanames = iiometa.getMetadataFormatNames(); 207 for (int j = 0; j < metanames.length; j++) { 208 System.out.println("--->" + metanames[j]); 209 DebugUtil.dumpNode(iiometa.getAsTree(metanames[j])); 210 } 211 } 212 213 } 214 | Popular Tags |