С помощью экземпляра ImageReader вы можете получить метаданные изображения в нейтральном формате, а затем проанализировать их на предмет того, что вам нужно. DTD здесь .
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: -");
(Источник / Вдохновение: Дэвид Тилен )
Обратите внимание, что вы получите dpi, только если он там есть.
Если вам интересно, что находится в XML метаданных, используйте этот код:
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);