2011-08-22 15 views

risposta

0

Ottenere l'istanza ImageReader. Quindi utilizzare il primo ImageReader, impostare l'input e leggere IIOImage o solo getImageMetadata (pageIndex). Ottiene il metadata xml del formato immagine neutro e lo analizza per i dati desiderati .

ImageInputStream iis = ImageIO.createImageInputStream(in); 
Iterator it = ImageIO.getImageReaders(iis); 
if (!it.hasNext()) { 
System.outprintln("No reader for this format"); 
} 
ImageReader reader = (ImageReader) it.next(); 
reader.setInput(iis); 
IIOMetadata meta = reader.getImageMetadata(0); 
IIOMetadataNode dimNode = meta.getStandardDimensionNode(); 
NodeList nodes = dimNode.getElementsByTagName("HorizontalPixelSize"); 
IIOMetadataNode dpcWidth = (IIOMetadataNode)nodes.nextElement(); 
nodes = dimNode.getElementsByTagName("VerticalPixelSize"); 
IIOMetadataNode dpcHeight = (IIOMetadataNode)nodes.nextElement(); 

// ... dot Calc per centimetro alla dpi: dpi = DPC/2,54

L'intera immagine formato dei metadati neutro

+1

Il metodo getStandardDimensionNode() dal tipo IIOMetadata non è visibile – guhai

+1

Il metodo nextElement() non è definito per il tipo NodeList – guhai

+0

Questo è il codice di un post forum piuttosto vecchio - non è più valido. – laura

0

ImageMagick è un potente strumento per tutti i lavori relativi immagine. IM deve essere installato e richiede alcune configurazioni per l'ambiente, ma ne vale la pena.

http://www.imagemagick.org

vi consiglio di utilizzare JMagick ingegno IM:

http://www.jmagick.org

Non voglio spiegare i dettagli su come dal momento che è documentato in URL dato.

+0

non vale assolutamente la pena con tutte le soluzioni java pure – Enerccio

6

È possibile utilizzare la libreria Sansone di Apache Commons per ottenere informazioni sull'immagine: http://commons.apache.org/imaging/index.html.

final ImageInfo imageInfo = Sanselan.getImageInfo(file_); 

final int physicalWidthDpi = imageInfo.getPhysicalWidthDpi(); 
final int physicalHeightDpi = imageInfo.getPhysicalHeightDpi(); 
+0

Funziona come il fascino :-) thx. – Marcin

4

Con l'aiuto di un'istanza ImageReader, è possibile ottenere l'immagine metadati in un formato neutro, e poi analizzarlo per quello che ti serve. Un DTD è here.

ImageInputStream iis = ImageIO.createImageInputStream(new File(path)); 
    Iterator it = ImageIO.getImageReaders(iis); 
    if (!it.hasNext()) 
    { 
     System.err.println("No reader for this format"); 
     return; 
    } 
    ImageReader reader = (ImageReader) it.next(); 
    reader.setInput(iis); 

    IIOMetadata meta = reader.getImageMetadata(0); 
    IIOMetadataNode root = (IIOMetadataNode) meta.getAsTree("javax_imageio_1.0"); 
    NodeList nodes = root.getElementsByTagName("HorizontalPixelSize"); 
    if (nodes.getLength() > 0) 
    { 
     IIOMetadataNode dpcWidth = (IIOMetadataNode) nodes.item(0); 
     NamedNodeMap nnm = dpcWidth.getAttributes(); 
     Node item = nnm.item(0); 
     int xDPI = Math.round(25.4f/Float.parseFloat(item.getNodeValue())); 
     System.out.println("xDPI: " + xDPI); 
    } 
    else 
     System.out.println("xDPI: -"); 
    if (nodes.getLength() > 0) 
    { 
     nodes = root.getElementsByTagName("VerticalPixelSize"); 
     IIOMetadataNode dpcHeight = (IIOMetadataNode) nodes.item(0); 
     NamedNodeMap nnm = dpcHeight.getAttributes(); 
     Node item = nnm.item(0); 
     int yDPI = Math.round(25.4f/Float.parseFloat(item.getNodeValue())); 
     System.out.println("yDPI: " + yDPI); 
    } 
    else 
     System.out.println("yDPI: -"); 

(Fonte/Inspiration: David Thielen)

noti che si otterrà un dpi solo se è lì.

Se vi chiedete cosa c'è nel XML Metadata, utilizzare questo codice:

StringWriter xmlStringWriter = new StringWriter(); 
    StreamResult streamResult = new StreamResult(xmlStringWriter); 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // http://stackoverflow.com/a/1264872/535646 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
    DOMSource domSource = new DOMSource(root); 
    transformer.transform(domSource, streamResult); 
    System.out.println (xmlStringWriter); 
-2

ho trovato questo interessante esempio:

tipi
ByteArrayInputStream bis = new 
    ByteArrayInputStream(uploadedFile.getContents()); 
Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg"); 
ImageReader reader = (ImageReader) readers.next(); 
IIOMetadata meta = reader.getImageMetadata(0); 
Element tree = (Element) meta.getAsTree("javax_imageio_jpeg_image_1.0"); 
Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0); 
int dpiH = Integer.parseInt(jfif.getAttribute("Xdensity")); 
int dpiV = Integer.parseInt(jfif.getAttribute("Ydensity")); 

/* now test that (dpiH == dpiV) */ 
/* imports are: 
import javax.imageio.ImageIO; 
import javax.imageio.ImageReadParam; 
import javax.imageio.ImageReader; 
import javax.imageio.metadata.IIOMetadata; 
import javax.imageio.stream.ImageInputStream; 
import org.primefaces.model.UploadedFile; 
import org.w3c.dom.Element; 
*/ 
Problemi correlati