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();

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

TIFF图片

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

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

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-imaging</artifactId>
    <version>1.0-alpha3</version>
</dependency>
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);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/173867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于“计算机中由于找不到msvcr120.dll,无法继续执行代码5种解决方法

今天&#xff0c;我想和大家分享一下关于“由于找不到msvcr120.dll,无法继续执行代码5种解决方法”的话题。在我们日常的使用中&#xff0c;有时候会遇到这样的问题&#xff1a;在运行某个程序时&#xff0c;突然提示“无法继续执行代码&#xff0c;因为找不到msvcr120.dll”。…

七天.NET 8操作SQLite入门到实战 - 第二天 在 Windows 上配置 SQLite环境

前言 SQLite的一个重要的特性是零配置的、无需服务器&#xff0c;这意味着不需要复杂的安装或管理。它跟微软的Access差不多&#xff0c;只是一个.db格式的文件。但是与Access不同的是&#xff0c;它不需要安装任何软件&#xff0c;非常轻巧。 七天.NET 8操作SQLite入门到实战…

Web功能测试有哪些常用方法?

检验方法 1页面链接检查每一个链接是否都有对应的页面&#xff0c;并且页面之间切换正确&#xff1b; 2相关性检查删除/增加一项会不会对其他项产生影响&#xff0c;如果产生影响&#xff0c;这些影响是否都正确。 3检查按钮的功能是否正确如update, cancel, delete, save等…

python3函数

1、定义函数 函数代码块以def关键词开头&#xff0c;后接函数标识符名称和圆括号任何传入参数和自变量必须放在圆括号中间&#xff0c;圆括号之间可以用于定义参数函数内容以冒号&#xff1a;起始&#xff0c;并且缩进return【表达式】结束函数&#xff0c;选择性返回一个值调…

MySQL之BETWEEN AND包含范围查询总结

一、时间范围 查询参数格式与数据库类型相对应时&#xff0c;between and包含头尾&#xff0c;否则依情况 当数据库字段中存储的是yyyy-MM-dd格式&#xff0c;即date类型&#xff1a; 用between and查询&#xff0c; 参数yyyy-MM-dd格式时&#xff0c;包含头尾&#xff0c;相当…

测试老鸟告诉你,直击准备2024年初/高级测试技术面试...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 你眼中的软件测试…

基于单片机预费电表控制系统(proteus仿真+源程序)

一、系统方案 1、本设计采用这51单片机作为主控器。 2、采集电量值送到液晶1602显示。 3、按键设置预设值&#xff0c;实际使用电量超过设置&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void LCD_init(void) { …

C语言——用递归函数计算n!

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 比别人多一点努力&#xff0c;你…

GCC 学习

GCC Resource Center for GCC Internalshttps://www.cse.iitb.ac.in/grc/这是个不错资料网站&#xff0c;有兴趣的可以了解下

软文转化率如何提高,媒介盒子分享三大原则

决定软文推广的主要因素就在于软文内容&#xff0c;但是如何才能提高软文转化率呢&#xff1f;下面就让媒介盒子为你解答&#xff01; 一、 软文类型 软文类型按照推广目标划分主要分为品牌软文、产品软文、营销软文。 ● 品牌软文 品牌软文的目的在于扩大品牌对群众的影响力…

消消乐游戏开发,消除类游戏

消除游戏是一类简单而又充满乐趣的休闲游戏&#xff0c;通过匹配相同的元素来完成任务&#xff0c;其简单直观的玩法吸引了大量玩家。本文将为你介绍设计和开发一款成功的消除游戏的关键步骤。 1. 确定核心玩法机制 消除游戏的核心在于匹配相同的元素。首先&#xff0c;明确定…

用Java实现简单的俄罗斯方块

一、创建新项目 1.首先新建一个项目&#xff0c;并命名为俄罗斯方块。 2.其次新建一个类&#xff0c;命名为Main&#xff0c;或其他的。 二、运行代码 package 俄罗斯方块;import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.a…

SSM高考志愿辅助推荐系统-计算机毕业设计附源码21279

目 录 摘要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 高考志愿辅助推荐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2…

LangChain的函数,工具和代理(一):OpenAI的函数调用

一、什么是函数调用功能 几个月前OpenAI官方发布了其API的函数调用功能(Function calling), 在 API 调用中&#xff0c;您可以描述函数&#xff0c;并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。API函数“ChatCompletion” 虽然不会实际调用该函数&#…

FL Studio21怎么破解?2024年最新FLStudio21.2.0安装解锁特别版下载使用图文教程

用FL Studio编曲&#xff0c;让音乐成为你的翅膀&#xff0c;飞翔在无尽的创作海洋中吧&#xff01; FL Studio作为一款功能强大且备受赞誉的音乐制作软件&#xff0c;为你提供了一个独特的创作平台。通过FL Studio&#xff0c;你可以自由地创作、编曲&#xff0c;制作属于自己…

【代数学习题4.1】从零理解范数与迹 —— 求极小多项式

从零理解范数与迹 —— 求极小多项式 写在前面概念解释题目解答 1. 极小多项式极小多项式的求法1. 对 α \alpha α 的极小多项式python求解 2. 对 α 1 \alpha 1 α1 的极小多项式python找到多项式python找到极小多项式 3. 对 α 2 α 1 \alpha^2 \alpha 1 α2α1 的…

Docker快速搭建RTMP服务(tiangolo/nginx-rtmp:Docker + Nginx+ nginx-rtmp-module)

Linux Docker快速搭建多媒体/视频流的 RTMP 服务 第一步 安装Docker 点击这里查看 第二步 拉取并运行镜像 tiangolo/nginx-rtmp/ docker pull tiangolo/nginx-rtmp docker run -d -p 1935:1935 --name nginx-rtmp tiangolo/nginx-rtmpOBS客户端测试 OBS客户端设置直播的推…

K8S精进之路-控制器Deployment-(1)

在K8S中&#xff0c;最小运行单位为POD,它是一个逻辑概念&#xff0c;其实是一组共享了某些资源的容器组。POD是能运行多个容器的&#xff0c;Pod 里的所有容器&#xff0c;共享的是同一个 Network Namespace&#xff0c;并且可以声明共享同一个 Volume。在POD中能够hold住网络…

3.基于多能互补的热电联供微网优化运行复现(matlab代码)

0.代码链接 基于多能互补的热电联供微电网/综合能源系统优化运行&#xff08;Matlab程序Yalmip&#xff0b;Cplex求解&#xff09;_工业综合能源系统资源-CSDN文库 2. 主要内容&#xff1a;代码主要做的是多能互补的热电联供型微网优化运行模型&#xff0c;在需求侧对负荷类型…

庖丁解牛:NIO核心概念与机制详解 07 _ 字符集

文章目录 Pre概述编码/解码处理文本的正确方式示例程序Code Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 庖丁解牛&#xff1a;NIO核心概念与机制详解 02 _ 缓冲区的细节实现 庖丁解牛&#xff1a;NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片 庖丁解牛&…