2011-08-22 70 views
5

c#ではImage.Horizo​​ntalResolutionとImage.VerticalResolutionを使用できます。イメージのdpiを取得する方法(Java)

しかし、Javaでは、どうすれば入手できますか?

ImageInfo.javaが見つかりましたが、いくつかの画像タイプしかサポートしていません。

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

+0

どのような画像の種類は、使用しているが、あなたがメタデータXMLで何だろ場合

、このコードを使用しますか? – mzjn

+0

私はソリューションがすべての画像タイプをサポートできる必要があります。 – guhai

答えて

0

あなたのImageReaderのインスタンスを取得します。次に、最初のImageReader、 を使用して入力を設定し、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(); 

解像度にセンチメートル当たり// ...カルクドット:

+1

タイプIIOMetadataのgetStandardDimensionNode()メソッドは表示されません – guhai

+1

NodeListタイプのメソッドnextElement()は未定義です – guhai

+0

これはかなり古くからのフォーラム投稿のコードです。 – laura

0

のImageMagickでDPI = DPC/2.54

画像全体ニュートラルメタデータ形式は、すべての画像に関連する作業のための強力なツールです。 IMをインストールする必要があり、環境のためにいくつかの設定が必要ですが、それは問題の価値があります。

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

charm :-) 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ソース/インスピレーション)。

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; 
*/ 
関連する問題