java指定图片的dpi和存储大小kb

  • google图片处理插件
  • java代码(只需要修改下文件路径往里面存图片就行了)
  • 参考文章
  • 公司需求,将文件夹下面的所有图片dpi设置为300,存储大小为90到150kb,折磨了我4天,今天终于解决了,写成本地直接能跑的代码记录一下。

  • 注意要将png(32位深度)格式的图片转换成jpg(24位深度)格式,只改变图片的后缀是不行的。

  • 查看图片修改后的dpi,在 FSViewer 里面查看,鼠标右键属性那里看到的值不准。

  • 需要引入 Thumbnailator 到 maven 项目里面的 pom.xml,或者直接去 官网下载.jar包导入项目。

google图片处理插件

<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.11</version>
</dependency>

java代码(只需要修改下文件路径往里面存图片就行了)

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import net.coobird.thumbnailator.Thumbnails;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;//需求,将文件夹下面的所有图片dpi设置为300,存储大小为90到150kb
public class ImgDemo {public static void main(String[] args) throws IOException {//文件夹路径String path = "C:\\Users\\Administrator\\Desktop\\zy\\";File[] allFiles = new File(path).listFiles();for (int i = 0; i < allFiles.length; i++) {File allFile = allFiles[i];//文件夹下的文件路径String filepath = allFile.getPath();//将所有图片转成jpg格式pngToJpg(filepath);//设置图片的dpimakeDpi(filepath, 300);//将文件转成字节数组byte[] bytesByFile = getBytesByFile(filepath);//设置文件的存储大小,dpi不变byte[] bytes = scaleRange(bytesByFile, 90 * 1024, 150 * 1024);//文件输出流写入文件try {FileOutputStream outstream = new FileOutputStream(filepath);assert bytesByFile != null;outstream.write(bytes);  // 写入文件outstream.close(); // 关闭资源} catch (FileNotFoundException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}}//png转jpg格式public static void pngToJpg(String filepath) {BufferedImage bufferedImage;try {bufferedImage = ImageIO.read(new File(filepath));BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(),BufferedImage.TYPE_INT_RGB);// TYPE_INT_RGB:创建一个RBG图像,24位深度,成功将32位图转化成24位newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0,Color.WHITE, null);ImageIO.write(newBufferedImage, "jpg", new File(filepath));} catch (IOException e) {e.printStackTrace();}}//设置dpipublic static void makeDpi(String filepath, int dpi) throws IOException {ImageReader reader = ImageIO.getImageReadersByFormatName("jpeg").next();reader.setInput(new FileImageInputStream(new File(filepath)), true, false);BufferedImage image = ImageIO.read(new File(filepath));int w = 2550, h = -1;FileOutputStream fos = new FileOutputStream(filepath);JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(fos);JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);jpegEncodeParam.setXDensity(dpi);jpegEncodeParam.setYDensity(dpi);jpegEncoder.encode(image, jpegEncodeParam);fos.close();}//将文件转换成Byte数组public static byte[] getBytesByFile(String pathStr) {File file = new File(pathStr);try {FileInputStream fis = new FileInputStream(file);ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);byte[] b = new byte[1000];int n;while ((n = fis.read(b)) != -1) {bos.write(b, 0, n);}fis.close();byte[] data = bos.toByteArray();bos.close();return data;} catch (Exception e) {e.printStackTrace();}return null;}//此部分为git上其他大佬写的插件,我把里面的核心代码拔出来直接用了//设置文件的存储大小,单位kbpublic static byte[] scaleRange(byte[] sourceBytes, long minSize, long maxSize) {if (sourceBytes != null && sourceBytes.length > 0 && ((long) sourceBytes.length > maxSize || (long) sourceBytes.length < minSize) && minSize <= maxSize) {byte[] desImageBytes = new byte[0];double startAccuracy = 0.0D;double endAccuracy = 0.0D;double currentAccuracy = 1.0D;try {Object var16;ByteArrayInputStream inputStream;ByteArrayOutputStream outputStream;byte[] currentImageBytes;if ((long) sourceBytes.length > maxSize) {startAccuracy = 0.0D;endAccuracy = 1.0D;} else {for (; desImageBytes.length == 0; var16 = null) {currentAccuracy *= 2.0D;inputStream = new ByteArrayInputStream(sourceBytes);outputStream = new ByteArrayOutputStream(sourceBytes.length);Thumbnails.of(new InputStream[]{inputStream}).scale(currentAccuracy).toOutputStream(outputStream);currentImageBytes = outputStream.toByteArray();if ((long) currentImageBytes.length <= maxSize && (long) currentImageBytes.length >= minSize) {desImageBytes = currentImageBytes;} else if ((long) currentImageBytes.length > maxSize) {startAccuracy = currentAccuracy / 2.0D;endAccuracy = currentAccuracy;break;}}}for (; desImageBytes.length == 0; var16 = null) {currentAccuracy = (startAccuracy + endAccuracy) / 2.0D;inputStream = new ByteArrayInputStream(sourceBytes);outputStream = new ByteArrayOutputStream(sourceBytes.length);Thumbnails.of(new InputStream[]{inputStream}).scale(currentAccuracy).toOutputStream(outputStream);currentImageBytes = outputStream.toByteArray();if ((long) currentImageBytes.length > maxSize) {endAccuracy = currentAccuracy;} else if ((long) currentImageBytes.length < minSize) {startAccuracy = currentAccuracy;} else {desImageBytes = currentImageBytes;}}} catch (Exception var15) {desImageBytes = sourceBytes;}return desImageBytes;} else {return sourceBytes;}}}

参考文章

参考的修改图片到指定的dpi的方法.
参考的png转jpg的方法.
参考的图片按指定存储大小保存的插件\git.

java指定图片的dpi和存储大小kb相关推荐

  1. 图片大大了怎么修改大小KB不改变尺寸

    我们在平时提交一些报名资料时,都需要上传证件照,而照片除了有尺寸要求之外,对图片的大小也就是多少KB也有要求,那么如何才能减小图片的大小达到上传要求呢?换言之有哪些无损压缩图片的方法呢? 如果是手机里 ...

  2. java将图片保存进mysql_Java存储图片到Mysql

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [1]视图层 action="${ctx}/web/UserInforServlet?method=userInforServlet" ...

  3. java 改变图片的DPI

    代码如下: public class test01 {private static int DPI = 300;public static void main(String[] args){Strin ...

  4. 学习java 第三天 数据类型以及存储大小取值范围 (one 大白 (●—●))

    java 8种基础数据类型分别是: byte.char.short.int.long.float.double.boolean 一个字节等于 8位 1byte=8bit(位) byte 占 一个字节 ...

  5. java 压缩图片至指定大小

    需求: 压缩图片至300k以下 一开始没有思路在网上搜,发现google有个插件叫Thumbnails,然后看到了这篇文章: https://blog.csdn.net/u010355502/arti ...

  6. 将图片修改到指定像素大小和存储大小

    需求如题, 一般我们会用Photoshop ps软件 实现, 但是要同时满足指定像素大小和存储大小的两个条件可能很多人并不知道怎么快速弄好, 反复修改, 费时费力,还不尽如人意, 闲话少叙, 正文解决 ...

  7. java截取图片-设置方位+设置大小

    java截取图片-设置方位+设置大小 package com.onegrid.darj.test; import java.awt.Rectangle;   import java.awt.image ...

  8. 将图片压缩至指定大小Kb(Thumbnailator)

    放代码前,先唠叨唠叨,舒缓一下我的郁闷之情. 今天下午改一个后台管理系统的需求,要求上传的图片要压缩到300kb,感觉不难,就开搞. 先撩拨一下度娘,搞点货出来瞅瞅,不复杂就干脆搬砖算了. 嗯,度娘不 ...

  9. java 压缩图片大小

    提供两个方法 1.压缩网络路径的图片 2.压缩本地路径的图片 直接复制PicUtils类就即用,具体看代码啦. package com.qiyi.util;import com.xiruo.medbi ...

最新文章

  1. 远程办公如何保持高效?这群开发者们是这样做的
  2. 中国到底需要多少博士点?
  3. Mac如何修改文件默认打开方式?
  4. MyEclipse项目中的包按层次显示
  5. MyBatis中Mapper映射文件的输入(parameterType)和输出(resultType)映射
  6. 从东南亚到中东,为什么社交类产品成为游戏出海的突破口?
  7. JFrame显示透明图片与动态图片
  8. python棋类项目规划一——五子棋游戏策划书——项目一
  9. DDD案例(2):从领域分析到代码实现
  10. WiFi-ESP8266入门http(3-2)网页认证上网-post请求
  11. 测试工程师到底需要具备哪些能力?
  12. 接入高德sdk的几个问题,=。=
  13. C语言所有头文件整理
  14. 第1章 Java程序设计概述
  15. 一文解释电路中常用电子元器件应用和选型01
  16. css小鸡破壳,小鸡出壳是小鸡自己破壳,还是鸡妈妈帮助破壳?
  17. ffmpeg简易使用应用分享(m3u8下载与视频合并等)
  18. 初入HTML和CSS
  19. fastadmin_短信宝插件_验证码发送、注册、登录
  20. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

热门文章

  1. MySql 存储boolean的数据
  2. 异常(如何捕获和抛出异常,自定义异常)
  3. 为什么要用Handler,怎么用Handler
  4. Maven第3篇:详解maven解决依赖问题
  5. 06 - table表格标签+ 行合并+列合并
  6. 短信ui--短信设置界面之sim卡短信管理
  7. mybatis----xml常用的标签
  8. Greedy——HDOJ 1789
  9. 《GRACE: Gradient Harmonized and Cascaded Labeling for Aspect-based Sentiment Analysis》阅读笔记
  10. [error] invalid array assignment