`

使用java imageio 调整图片DPI,例如从72调整为300

阅读更多

Java生成图片默认分辨率是72dpi,由于需要打印生成图片,要求图片分辨率至少300dpi,这个问题整了将近一天时间,最终得到解决,感谢网友的分享。在这里记录一下,已备后面使用。以下代码摘抄至https://my.oschina.net/osgit/blog/530283

/**
* 接口设计
*/
public interface ImageDPIProcessor {

    /**
     * 根据文件后缀扩展名判断是否能进行处理
     * 
     * @param fileName
     * @return
     */
    public boolean canHandle(String fileName);

    /**
     * 
     * @param path
     * @param dpi
     *            dot per inch
     * @return
     * @throws IOException
     * @throws MalformedURLException
     */
    public byte[] process(final BufferedImage srcimage, final int dpi) throws Exception;

 

JPEG 处理方式

public class JpegDPIProcessor implements ImageDPIProcessor {

    private String formatName = "jpeg";

    @Override
    public byte[] process(BufferedImage image, int dpi) throws IOException {
        for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
            ImageWriter writer = iw.next();

            ImageWriteParam writeParams = writer.getDefaultWriteParam();
            writeParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            //调整图片质量
            writeParams.setCompressionQuality(1f);

            IIOMetadata data = writer.getDefaultImageMetadata(new ImageTypeSpecifier(image), writeParams);
            Element tree = (Element) data.getAsTree("javax_imageio_jpeg_image_1.0");
            Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
            jfif.setAttribute("Xdensity", dpi + "");
            jfif.setAttribute("Ydensity", dpi + "");
            jfif.setAttribute("resUnits""1"); // density is dots per inch

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ImageOutputStream stream = null;
            try {
                stream = ImageIO.createImageOutputStream(out);
                writer.setOutput(stream);
                writer.write(data, new IIOImage(image, nullnull), writeParams);
            } finally {
                stream.close();
            }

            return out.toByteArray();
        }
        return null;

    }

    @Override
    public boolean canHandle(String fileName) {
        assert fileName != null : "fileName should not be null";

        return fileName.endsWith("jpg") || fileName.endsWith("jpeg") || fileName.endsWith("JPG")
                || fileName.endsWith("JPEG");
    }

}

 

PNG处理方式:

public class PngDPIProcessor implements ImageDPIProcessor {
   //1英寸是2.54里面
    private static final double INCH_2_CM = 2.54d;

    @Override
    public boolean canHandle(String fileName) {
        assert fileName != null : "fileName should not be null";

        return fileName.endsWith("png") || fileName.endsWith("PNG");
    }

    @Override
    public byte[] process(BufferedImage image, int dpi) throws MalformedURLException, IOException {


        for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName("png"); iw.hasNext();) {
            ImageWriter writer = iw.next();
            ImageWriteParam writeParam = writer.getDefaultWriteParam();
            ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
            IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
            if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
                continue;
            }
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            ImageOutputStream stream = null;
            try {
                setDPI(metadata, dpi);
                stream = ImageIO.createImageOutputStream(output);
                writer.setOutput(stream);
                writer.write(metadata, new IIOImage(image, null, metadata), writeParam);
            } finally {
                try {
                    stream.close();
                } catch (IOException e) {
                }
            }
            return output.toByteArray();
        }

        return null;
    }

    private void setDPI(IIOMetadata metadata, int dpi) throws IIOInvalidTreeException {

        // for PMG, it's dots per millimeter
        double dotsPerMilli = 1.0 * dpi / 10 / INCH_2_CM;
        IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
        horiz.setAttribute("value", Double.toString(dotsPerMilli));

        IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
        vert.setAttribute("value", Double.toString(dotsPerMilli));

        IIOMetadataNode dim = new IIOMetadataNode("Dimension");
        dim.appendChild(horiz);
        dim.appendChild(vert);

        IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
        root.appendChild(dim);

        metadata.mergeTree("javax_imageio_1.0", root);
    }
主要参考文章:
https://my.oschina.net/osgit/blog/530283
http://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image
分享到:
评论

相关推荐

    修改压缩图片的dpi_dpi_

    当我们处理图像时,尤其是对于压缩图片,有时需要调整DPI以满足特定的输出需求。本话题将详细介绍如何在Java环境中修改图片的DPI。 首先,我们需要理解Java中处理图像的基本概念。Java提供了`java.awt.image....

    如何使用Java读取这张图片的分辨率?

    要实现这一功能,我们需要利用Java的内置库`javax.imageio`和`java.awt.Image`。本篇文章将详细讲解如何通过Java读取图像文件`hs8mm.jpg`的分辨率。 首先,让我们导入所需的Java库: ```java import java.awt....

    java 使用ImageIO.writer从BufferedImage生成jpeg图像遇到问题总结及解决

    总结起来,使用ImageIO.writer从BufferedImage生成JPEG图像时,应当遵守Java的规范和API的使用限制。在不同版本的Java环境中,需要小心处理可能遇到的兼容性问题。同时,要注意图像处理过程中可能遇到的异常,并编写...

    JAVA实现多页PDF转一张长图图片

    接下来,为了将PDF页面转换为图像,我们可以使用Java的`javax.imageio.ImageIO`类,它提供了读取和写入图像文件的功能。我们可以创建一个BufferedImage对象,然后使用`PDFPageView`的`renderImageWithDPI`方法将其...

    Java中PDF转图片

    本文将深入探讨如何使用Java库来实现这个功能,以标题“Java中PDF转图片”和描述“Java中PDF转图片”为线索,结合标签“PDF转图片”,我们将详细讲解一种常用的库——IcePDF。 IcePDF是一个开源的Java PDF库,它...

    用java把2个tiff或图片合并成一个tiff或图片

    合并后,使用`ImageIO.write()`方法将新图像保存为TIFF或其他格式。 4. **图像合并**:合并两个图像通常涉及到创建一个新的`BufferedImage`对象,设置其宽度和高度为两个输入图像的总和。然后,遍历每个输入图像,...

    java pdf转图片

    Java PDF转图片是一种常见的需求,尤其在数据可视化、文档预览或者网页集成中。这个过程涉及到将PDF文档的页面转换成图像格式,如JPEG、PNG等。以下是对这个主题的详细解析: 首先,理解PDF(Portable Document ...

    java版PDF转图片

    本篇将详细讲解如何使用Java的PDFBox库将PDF文件转换为图片,并涉及指定页数、清晰度和自定义尺寸等关键参数。 PDFBox是Apache软件基金会的一个开源项目,专门用于处理PDF文档。它提供了丰富的API,可以用来读取、...

    pdf转高清图片

    在实际应用中,应根据具体需求调整代码,例如调整输出图片的格式、尺寸、DPI等参数,或者进行批量转换。 总的来说,PDF转高清图片的技术涉及PDF解析、图像渲染和图像处理等多个领域,而Java中的Apache PDFBox库为...

    itext7 pdf转图片

    一旦图像被渲染,就可以使用Java的`ImageIO`类将其保存为常见的图像格式,如JPEG或PNG。 4. 示例代码: - 在给定的文件列表中,"Program.cs"可能是实现此功能的C#代码。`pdf2image02.csproj`是一个.NET项目文件,...

    将PDF文件转换为Image图像文件的Java源码

    然而,有时我们需要将PDF文件转换为图像文件,例如为了在网页上显示或者进行图片处理。Java作为一种多用途的开发语言,提供了丰富的库来处理这种任务。本篇我们将深入探讨如何使用Java源码将PDF文件转换为Image图像...

    pdf转图片所需jar包

    在Java开发中,有时我们需要将PDF文档转换为图片格式,以便于在线预览、存储或者进行其他处理。本文将详细讲解如何使用Java实现这一功能,特别是依赖于`pdfbox-2.0.11.jar`和`fontbox-2.0.11.jar`这两个关键的库文件...

    pdfbox读取pdf文档转为高清图片的例子

    4. **转换为图片**:创建好RenderedImage后,我们可以使用Java的`BufferedImage`类将其保存为常见的图像格式,如JPG或PNG。`ImageIO.write()`方法可以实现这一点,需要指定BufferedImage对象、图像格式和输出文件...

    Springboot使用pdfbox提取PDF图片

    5. **图片格式转换**:如果需要将图片保存为特定格式(如JPEG、PNG),可以使用Java的`ImageIO`类进行转换。 **使用示例** 在Controller层,我们可以创建一个API接口,接收PDF文件路径,调用服务方法并返回图片...

    轻松使用apache pdfbox将pdf文件生成图片.pdf

    - **分辨率和质量**:`convertToImage()`方法可以设置图像的DPI(每英寸点数)以调整输出图片的清晰度。 - **颜色空间**:根据需求选择灰度、RGB或CMYK颜色空间。 总之,Apache PDFBox是一个强大的工具,可以帮助...

    PdfToImageTest.zip

    6. 保存图像:将生成的`BufferedImage`对象保存为图像文件,例如JPG或PNG格式,使用`ImageIO.write(BufferedImage, String, File)`方法完成。 “使用说明书.txt”文件很可能是对如何运行这个Java应用程序的详细指导...

    PDF转图片代码实例(完美实现)

    在IT行业中,转换PDF文档为图片是一项常见的需求,特别是在数据可视化、网页展示或者移动设备阅读等方面。本实例将深入探讨如何使用代码实现这一功能,并且着重解决中文处理的问题,确保转换过程中的文字清晰可读。 ...

    JAVASE通过调用接口获取PDF文件并对PDF分割并打印,PDF不支持直接打印必须先转成JPG再打印

    例如,可以使用`PDFPageImageSaver`类,设定DPI(每英寸点数)和图像质量,将PDF页面保存为JPG图片。 4. **Java图像处理**: 在转换为JPG后,我们可能需要进一步处理这些图像,比如调整尺寸、压缩等,以便适应...

    pdfbox切图

    同时,可以根据需要调整DPI值,以获得更清晰或更小的图像。 在实际应用中,你可能还需要处理一些边缘情况,比如PDF加密、页面旋转、颜色模式转换等。PDFBox库提供了相应的API来处理这些问题。例如,对于加密的PDF,...

    pukeImage.zip

    Java会默认按照屏幕的像素密度来处理图像,因此在加载这些图片时,我们不需要特别调整DPI。 接着,了解Java中的图像处理。Java的`java.awt.image`包提供了多种类来处理图像,如`BufferedImage`。我们可以使用`...

Global site tag (gtag.js) - Google Analytics