2011-08-22 8 views
5

Trong C#, chúng ta có thể sử dụng Image.HorizontalResolution và Image.VerticalResolution.Cách lấy dpi của ảnh (Java)

Nhưng trong java, cách tải xuống?

Tôi tìm thấy ImageInfo.java, nhưng nó chỉ hỗ trợ một vài loại hình ảnh.

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

+0

hình ảnh gì được bạn làm việc với ai? – mzjn

+0

Tôi cần giải pháp có thể hỗ trợ tất cả các loại hình ảnh. – guhai

Trả lời

0

Tải phiên bản ImageReader của bạn. Sau đó, sử dụng ImageReader đầu tiên, đặt Đầu vào và đọc IIOImage hoặc chỉ getImageMetadata (pageIndex). Bạn nhận được định dạng hình ảnh siêu dữ liệu trung lập xml và phân tích cú pháp cho dữ liệu mong muốn .

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

// ... calc dot per cm để dpi: dpi = dpc/2.54

Hình ảnh toàn trung lập định dạng siêu dữ liệu tại

+1

Phương thức getStandardDimensionNode() từ loại IIOMetadata không hiển thị – guhai

+1

Phương thức nextElement() không xác định cho loại NodeList – guhai

+0

Đây là mã từ một bài đăng trên diễn đàn khá cũ - nó không còn giá trị. – laura

0

ImageMagick là một công cụ mạnh mẽ cho tất cả các công việc liên quan đến hình ảnh. IM cần phải được cài đặt và yêu cầu một số cấu hình cho môi trường nhưng nó có giá trị rắc rối.

http://www.imagemagick.org

tôi khuyên bạn nên sử dụng JMagick wit IM:

http://www.jmagick.org

Tôi sẽ không giải thích chi tiết về làm thế nào để vì nó được ghi chép lại trong các url nhất định.

+0

chắc chắn KHÔNG đáng giá với mọi giải pháp java thuần túy – Enerccio

6

Bạn có thể sử dụng thư viện Apache Commons Sanselan để lấy thông tin hình ảnh: http://commons.apache.org/imaging/index.html.

final ImageInfo imageInfo = Sanselan.getImageInfo(file_); 

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

Hoạt động như quyến rũ :-) thx. – Marcin

4

Với sự giúp đỡ của phiên bản ImageReader, bạn có thể lấy siêu dữ liệu hình ảnh ở định dạng trung lập, sau đó phân tích cú pháp cho những gì bạn cần. DTD là 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: -"); 

(Nguồn/Inspiration: David Thielen)

Lưu ý rằng bạn sẽ nhận được một dpi chỉ khi nó là ở đó.

Nếu bạn tự hỏi những gì trong XML Metadata, sử dụng mã này:

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

tôi thấy ví dụ này thú vị:

loại
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; 
*/