2011-08-22 16 views
5

सी # में, हम छवि का उपयोग कर सकते हैं। हॉरिज़ोंटल रेसोल्यूशन और इमेज। वर्टिकल रेसोल्यूशन।छवि के डीपीआई कैसे प्राप्त करें (जावा)

लेकिन जावा में, इसे कैसे प्राप्त करें?

मुझे ImageInfo.java मिला, लेकिन यह केवल कुछ छवि प्रकारों का समर्थन करता है।

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

+0

क्या छवि प्रकार आप के साथ काम कर रहे हैं

आपको आश्चर्य क्या मेटाडाटा XML में है, इस कोड का उपयोग? – mzjn

+0

मुझे समाधान की आवश्यकता है सभी छवि प्रकारों का समर्थन कर सकते हैं। – guhai

उत्तर

0

अपने ImageReader उदाहरण प्राप्त करें। फिर पहले ImageReader का उपयोग करें, इनपुट सेट करें और IIOImage पढ़ें या केवल IMageMetadata (पेज इंडेक्स) प्राप्त करें। आपको छवि प्रारूप तटस्थ मेटाडाटा 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 के प्रति calc डॉट: डीपीआई = डीपीसी/2.54

संपूर्ण चित्र तटस्थ मेटाडाटा प्रारूप

+1

विधि IIOMetadata प्रकार से मानक मानक आयाम() दिखाई नहीं देता है – guhai

+1

विधि अगला एलीमेंट() विधि नोडलिस्ट – guhai

+0

के लिए अपरिभाषित है यह पुराना फ़ोरम पोस्ट से कोड है - यह अब मान्य नहीं है। – laura

0

ImageMagick बिल्कुल छवि से संबंधित काम के लिए एक शक्तिशाली उपकरण है। आईएम को स्थापित करने की आवश्यकता है और पर्यावरण के लिए कुछ विन्यास की आवश्यकता है लेकिन यह मुसीबत के लायक है।

http://www.imagemagick.org

मैं सुझाव है कि आप JMagick बुद्धि आईएम का उपयोग करें:

http://www.jmagick.org

मैं के बाद से यह देखते हुए यूआरएल में प्रलेखित है कैसे पर विवरण की व्याख्या नहीं होगा।

+0

यह निश्चित रूप से सभी शुद्ध जावा समाधानों के साथ परेशानी के लायक नहीं है – Enerccio

6

आप छवि जानकारी प्राप्त करने के लिए अपाचे कॉमन्स सांसेलैन लाइब्रेरी का उपयोग कर सकते हैं: 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 उदाहरण की मदद से

, आप छवि एक तटस्थ प्रारूप में मेटा डेटा मिलता है, और उसके बाद आपको क्या चाहिए के लिए यह पार्स कर सकते हैं। एक डीटीडी 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; 
*/ 
संबंधित मुद्दे