• java创建指定分辨率的图片或修改图片的分辨率(DPI)


    因为java默认的图片像素分辨率DPI=72,分辨率有点低。所以研究了一下如何创建指定DPI的方案。

    DPI: 指的是每英尺的像素点(dots per inch)

    JPEG图片

    JPEG图片的元数据定义参看oracle官网。
    https://docs.oracle.com/javase/8/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html

    参数说明

    参数默认值说明
    resUnits0单位(0 = no units, just aspect ratio; 1 = dots/inch; 2 = dots/cm)
    Xdensity1The horizontal density or aspect ratio numerator
    Ydensity1The vertical density or aspect ratio denominator

    如下代代码创建一张分辨率为300DPI(dots/inch)的jpg图片。

    
    String path = "res.jpg";
    final BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = image.createGraphics();
    //        // fill all the image with white
    g2d.setColor(Color.white);
    g2d.fillRect(0, 0, w, h);
    
    // Disposes of this graphics context and releases any system resources that it is using.
    g2d.dispose();
    
    ImageIO.write(image, "jpg", Files.newOutputStream(Paths.get(path)));
    
    final ImageWriter writer = ImageIO.getImageWritersBySuffix("jpeg").next();
    //        writeParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    //调整图片质量
    //        writeParams.setCompressionQuality(1f);
    
    ImageOutputStream ios = ImageIO.createImageOutputStream(new File(path));
    writer.setOutput(ios);
    
    ImageWriteParam param = writer.getDefaultWriteParam();
    IIOMetadata metadata = writer.getDefaultImageMetadata(new ImageTypeSpecifier(image.getColorModel(), image.getSampleModel()), param);
    Element tree = (Element) metadata.getAsTree("javax_imageio_jpeg_image_1.0");
    Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
    jfif.setAttribute("Xdensity", "300");
    jfif.setAttribute("Ydensity", "300");
    jfif.setAttribute("resUnits", "1"); // density is dots per inch
    
    metadata.mergeTree("javax_imageio_jpeg_image_1.0", tree);
    writer.write(null, new IIOImage(image, null, metadata), param);
    writer.dispose();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    可以在ps上看到分辨率是300.(打开ps,点击“图像”->“图像大小”)
    在这里插入图片描述

    TIFF图片

    commons-imaging 对Tiff的支持比较好。

    使用commons-imaging 创建一张分辨率为300DPI(dots/inch)的tiff图片。

    <dependency>
        <groupId>org.apache.commonsgroupId>
        <artifactId>commons-imagingartifactId>
        <version>1.0-alpha3version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    String path = "res.tif";
    final BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    final TiffImagingParameters params = new TiffImagingParameters();
    final PixelDensity pixelDensity = PixelDensity.createFromPixelsPerInch(300, 300);
    params.setPixelDensity(pixelDensity);
    TiffImageParser tiffImageParser = new TiffImageParser();
    tiffImageParser.writeImage(image, new FileOutputStream(path), params);
    
    final ImageInfo imageInfo = Imaging.getImageInfo(new File(path));
    if (imageInfo != null) {
       final int xReadDPI = imageInfo.getPhysicalWidthDpi();
       final int yReadDPI = imageInfo.getPhysicalHeightDpi();
       System.out.println(xReadDPI);
       System.out.println(yReadDPI);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    ps查看下分辨率。确实是300.
    在这里插入图片描述

  • 相关阅读:
    丑单2023秋招笔试第一题 子串之和(C++ 回溯)
    弘辽科技:淘宝店铺层级分越高越好吗?对流量有什么影响?
    redis
    rust泛型
    HarmonyOS开发探索:自定义键盘-webview
    黑豹程序员-架构师学习路线图-百科:HTML-网页三剑客
    MyBatis foreach标签有什么作用呢?
    java计算机毕业设计共享充电宝管理系统演示录像2021源码+mysql数据库+系统+lw文档+部署
    前端自动脚本中常见的几个问题,你遇到了吗?
    工业树莓派S/SE新系列究竟“新”在何处?点进来查看性能测试结果
  • 原文地址:https://blog.csdn.net/u012386311/article/details/134537172