Как получить dpi изображения (Java) - PullRequest
5 голосов
/ 22 августа 2011

В c # мы можем использовать Image.HorizontResolution и Image.VerticalResolution.

Но в Java, как его получить?

Я нашел ImageInfo.java, но он поддерживает только несколько типов изображений.

http://kickjava.com/src/imageinfo/ImageInfo.java.htm

Ответы [ 5 ]

6 голосов
/ 20 июня 2012

Вы можете использовать библиотеку 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();
4 голосов
/ 09 января 2014

С помощью экземпляра 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);
0 голосов
/ 21 апреля 2015

Мне показался интересным этот пример:

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;
*/
0 голосов
/ 22 августа 2011

ImageMagick - мощный инструмент для работы с изображениями.IM должен быть установлен и требует определенной конфигурации для среды, но это стоит того.

http://www.imagemagick.org

Я рекомендую использовать JMagick с IM:

http://www.jmagick.org

Я не буду объяснять подробности , как , поскольку это задокументировано в приведенных URL-адресах.

0 голосов
/ 22 августа 2011

Получите ваш экземпляр ImageReader. Затем используйте первый ImageReader, установите Input и прочитайте IIOImage или только getImageMetadata (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: dpi = dpc / 2.54

Формат нейтральных метаданных всего изображения в

...