在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