2011-08-22 83 views

回答

0

让您的ImageReader的实例。然后使用第一个ImageReader,设置输入并读取IIOImage或仅获取图像元数据(pageIndex)。 您将获得图像格式中性元数据xml并对其进行解析,获取所需的数据 。

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(); 

// ...每厘米新闻部计算点:DPI = DPC/2.54

的整体形象中性的元数据格式在

+1

类型IIOMetadata中的方法getStandardDimensionNode()不可见 – guhai

+1

未定义类型NodeList方法nextElement() – guhai

+0

这是来自相当旧的论坛帖子的代码 - 它不再有效。 – laura

0

ImageMagick的是所有图像相关工作的有力工具。即时通讯需要安装,并需要一些环境配置,但它是值得的麻烦。

http://www.imagemagick.org

我建议你使用JMagick机智IM:

http://www.jmagick.org

,因为它是在给定的URL记录我不会解释上如何细节。

+0

它绝对不值得所有纯Java解决方案的麻烦 – Enerccio

6

您可以使用Apache Commons Sanselan图书馆获取图像信息:http://commons.apache.org/imaging/index.html

final ImageInfo imageInfo = Sanselan.getImageInfo(file_); 

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

工程像魅力:-) thx。 – Marcin

4

在ImageReader实例的帮助下,您可以以中性格式获取图像元数据,然后解析它以获取所需内容。 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: -"); 

(来源/灵感:David Thielen

注意,你会得到一个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); 
-2

我发现这个有趣的例子:

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; 
*/