文档章节

图片PNG,JPEG DPI 调整

刘少
 刘少
发布于 2015/11/14 12:12
字数 395
阅读 3610
收藏 8
/**
* 接口设计
*/
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, null, null), 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);
    }
}

 

 

© 著作权归作者所有

共有 人打赏支持
刘少
粉丝 13
博文 31
码字总数 12465
作品 0
海淀
程序员
私信 提问
加载中

评论(4)

刘少
刘少

引用来自“loyal”的评论

卧槽!!!你大爷的!坑比啊.把别人除号改成乘号害的老子折腾两天...幸好找到这段代码的原版了
确实错了,抱歉
loyal
loyal
http://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image
loyal
loyal
卧槽!!!你大爷的!坑比啊.把别人除号改成乘号害的老子折腾两天...幸好找到这段代码的原版了
xaoyaoyao
xaoyaoyao
JPE的dpi设置好像没有效果~
用MS Visio假装提高图片分辨率来骗过某些论文提交检查系统的图片DPI要求

把图片扔进Visio后另存为jpeg图片,弹出窗口可选dpi和尺寸,让两者错开默认选项即可 结果图片质量本身其实没有提高,但是可以通过300DPI的检测了,从72dpi飞跃到了1200dpi.下面为改前与改后对...

ianmay
2016/09/06
29
0
如何让Ubuntu系统支持WebP图片格式

什么是WebP图片 Google开发并推出 WebP 图片格式已有 5 年了,WebP 可以提供对图片的有损和无损压缩。据官方宣称,对相同图片压缩后,平均会比 JPEG 体积缩小 25%。 原本Google雄心勃勃的想让...

linuxprobe
2016/06/09
38
0
Android性能优化之图片优化

图片的加载和显示是每个APP都避免不了的问题,再了解Android中如何图片优化之前,先看一下Android系统支持的图片格式。 1. 图片的格式 目前移动端Android平台原生支持的图片格式主要有:JPE...

sinat_36668731
2017/08/28
0
0
《Head first HTML与CSS 第二版》读书笔记 第五章 图像

Web上常用的图片格式有三种: JPEG PNG GIF 适合连续色调图像,如照片。 适合单色图像和线条构成的图像 (如logo、剪贴画和图像中的小文本)。 类似于PNG, 适合于单色图像和线条构成的图像。...

一万
2016/07/29
21
0
图像转ASCII字符拼图--Jitac

Jitac 是一个 Java 程序可将图片转成用 ASCII 字符拼成的块图片。支持多种图片格式(GIF, JPEG, TIFF, and PNG) ,并且可在转换之前对图像进行简单操作,包括:反演,灰度,调整大小,和伽马校正...

匿名
2012/12/28
9.1K
20

没有更多内容

加载失败,请刷新页面

加载更多

kubernetes 二进制包安装

环境 角色 主机名 内网 IP 集群 IP 操作系统 服务 执行目录 部署机 k8s-master master120 10.0.4.120 - CentOS kube-apiserver kube-scheduler kube-controller-manager /opt/kubernetes/ et......

Colben
7分钟前
0
0
瑞达利欧的《原则》读后感作文2400字

瑞达利欧的《原则》读后感作文2400字: 拿到同事送的书读了几十页后,我意识到自己犯了一个错误:之前以为像《原则》这个书名,配上最成功的对冲基金经理、受用终身的教诲、傅盛引用并盛赞,...

原创小博客
24分钟前
1
0
java内存占用异常问题常见排查流程(含堆外内存异常)

先初步介绍一下内存组成: java进程占用内存 约等于 Java永久代 + Java堆(新生代和老年代) + 线程栈+ Java NIO,其它部分占用内存较小, 详细可以参考这篇文章 https://my.oschina.net/h...

小海bug
31分钟前
0
0
成为架构师需要学习哪些技能?阿里P9架构师为你解答

不想当将军的兵不是好兵,就程序猿不想当架构师就不是好的程序员! Java架构师主要需要做哪些工作呢? 1、负责设计和搭建软件系统架构(平台、数据库、接口和应用架构等),解决开发中各种系...

别打我会飞
34分钟前
0
0
使用xtrabackup备份数据库

使用xtrabackup备份数据库 提供一个参考文档:http://xtra.aminglinux.com mysqldump对于导出几个G的数据库或几个表,还是不错的,速度并不慢。一旦数据量达到几十上百G,无论是对原库的压力...

wzb88
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部