在c#中,我們可以使用Image.HorizontalResolution和Image.VerticalResolution。如何獲得圖像的dpi(Java)
但在java中,如何得到它?
我發現ImageInfo.java
,但它只支持幾種圖像類型。
http://kickjava.com/src/imageinfo/ImageInfo.java.htm
在c#中,我們可以使用Image.HorizontalResolution和Image.VerticalResolution。如何獲得圖像的dpi(Java)
但在java中,如何得到它?
我發現ImageInfo.java
,但它只支持幾種圖像類型。
http://kickjava.com/src/imageinfo/ImageInfo.java.htm
讓您的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
的整體形象中性的元數據格式在
ImageMagick的是所有圖像相關工作的有力工具。即時通訊需要安裝,並需要一些環境配置,但它是值得的麻煩。
我建議你使用JMagick機智IM:
,因爲它是在給定的URL記錄我不會解釋上如何細節。
它絕對不值得所有純Java解決方案的麻煩 – Enerccio
您可以使用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();
工程像魅力:-) thx。 – Marcin
在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);
我發現這個有趣的例子:
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;
*/
什麼樣的形象類型是你的工作? – mzjn
我需要的解決方案可以支持所有的圖像類型。 – guhai