ImageIO类说明

最近的项目中遇到ImageIO,因此记录下这个类的用法
一、ImageIO:
这个类中的方法都是静态方法,可以用来进行简单的图片IO操作
1、读入的三种方法
public static BufferedImage read(File input)

File file = new File("/Users/xixi/Documents/aaa.png");
BufferedImage bu = ImageIO.read(file);12
public static BufferedImage read(InputStream input)public static BufferedImage read(ImageInputStream stream)

2、RenderedImage接口的子类是BufferedImage,因此在这里可以直接出传入BufferedImage的实例化对象,将BufferedImage对象直接写出指定输出流

public static boolean write(RenderedImage im,String formatName,File output)public static boolean write(RenderedImage im, String formatName,OutputStream output)public static boolean write(RenderedImage im, String formatName,ImageOutputStream output)
public class Test {public static void main(String[] args) {File out = new File("/Users/wangjue/DownLoads/1.jpg");//将图片写入ImageIO流try {BufferedImage img = ImageIO.read(out);//将图片写出到指定位置(复制图片)OutputStream ops = new FileOutputStream(new File("/Users/wangjue/DownLoads/1(1).jpg"));ImageIO.write(img, "jpg", ops);         } catch (IOException e) {e.printStackTrace();}}}


ImageIo类常用方法以及图片操作

常用方法


  1. 写操作的方法

    从图中可以看到有三个重载的方法,返回的类型都是BufferedImage

  2. 实际操作

   @Testpublic void imageIOTest() {String imagePath = "D:\\test4.jpg";try {File file = new File(imagePath);String encode = URLEncoder.encode(imagePath, "utf-8");URL url = new URL("file:///" + encode);InputStream fileInputStrem = new FileInputStream(imagePath);ImageInputStream fileImageInputStream = new FileImageInputStream(file);/*** public static BufferedImage read(File input)*/BufferedImage read_1 = ImageIO.read(file);/*** public static BufferedImage read(InputStream input)*/BufferedImage read_2 = ImageIO.read(fileInputStrem);/*** public static BufferedImage read(ImageInputStream stream)*/BufferedImage read_3 = ImageIO.read(fileImageInputStream);/*** public static BufferedImage read(URL)*/BufferedImage read_4 = ImageIO.read(url);Assert.assertEquals(false, read_1 == null);Assert.assertEquals(false, read_2 == null);Assert.assertEquals(false, read_3 == null);Assert.assertEquals(false, read_4 == null);} catch (IOException e) {e.printStackTrace();}}

  1. 在这里插入图片描述
    可以看到常见的写方法如上。

    RenderedImage接口的子类是BufferedImage,因此在这里可以直接出传入BufferedImage的实例化对象,将BufferedImage对象直接写出指定输出流

    实际操作

         /***public static boolean write(RenderedImage im,String formatName,File output)*/boolean write_1 = ImageIO.write(read_1, "jpg", new File("e:/test.jpg"));/*** public static boolean write(RenderedImage im, String formatName,ImageOutputStream output)*/boolean write_2 = ImageIO.write(read_2, "jpg", new FileImageOutputStream(new File("e:/test2.jpg")));/*** public static boolean write(RenderedImage im, String formatName,OutputStream output)*/boolean write_3 = ImageIO.write(read_2, "jpg", new FileOutputStream("e:/test3.jpg"));Assert.assertEquals(true, write_1);Assert.assertEquals(true, write_2);Assert.assertEquals(true, write_3);
    

图片操作

这一小节在参考 https://blog.csdn.net/tielan/article/details/43760301#commentBox 文档的基础上实现。详细看跳转查看

  1. 将指定颜色变透明 只能保存 png jpg

      /*** 将指定颜色变透明 只能保存 png jpg** @param imageSrc* @param mask* @return*/public static BufferedImage createImageByMaskColorEx(BufferedImage imageSrc, Color mask) {int x, y;x = imageSrc.getWidth(null);y = imageSrc.getHeight(null);BufferedImage imageDes = new BufferedImage(x, y,BufferedImage.TYPE_4BYTE_ABGR);WritableRaster rasterDes = imageDes.getRaster();int[] des = new int[4];while (--x >= 0)for (int j = 0; j < y; ++j) {int rgb = imageSrc.getRGB(x, j);int sr, sg, sb;sr = (rgb & 0xFF0000) >> 16;sg = (rgb & 0xFF00) >> 8;sb = rgb & 0xFF;if (sr == mask.getRed() && sg == mask.getGreen()&& sb == mask.getBlue()) {des[3] = 0;} else {des[0] = sr;des[1] = sg;des[2] = sb;des[3] = 255;}rasterDes.setPixel(x, j, des);}return imageDes;}
    
  2. 按倍率缩小图片

      /*** 按倍率缩小图片** @param imageSrc    读取图片路径* @param imageDest   写入图片路径* @param widthRatio  宽度缩小比例* @param heightRatio 高度缩小比例*/public static void reduceImageByRatio(String imageSrc, String imageDest, int widthRatio, int heightRatio) {FileOutputStream outputStream = null;try {File file = new File(imageSrc);BufferedImage read = ImageIO.read(file);int width = read.getWidth();int height = read.getHeight();/*** 根据缩放比较 构建新的BufferImage 对象*/BufferedImage destBufferImage = new BufferedImage(width / widthRatio, height / heightRatio, BufferedImage.TYPE_INT_RGB);/*** 绘制 缩小  后的图片*/destBufferImage.getGraphics().drawImage(read, 0, 0, width / widthRatio, height / heightRatio, null);outputStream = new FileOutputStream(imageDest);ImageIO.write(destBufferImage, "jpg", outputStream);} catch (IOException e) {e.printStackTrace();}}
    
  3. 按比例放大图片

       /*** 按比例方法图片** @param imageSrc    读取图片路径* @param imageDest   写入图片路径* @param widthRatio  宽度放大比例* @param heigthRatio 高度放大比例*/public static void enlargementImageByRatio(@NonNull String imageSrc, @NonNull String imageDest, int widthRatio, int heigthRatio) {FileOutputStream outputStream = null;try {//读取图片构建 BufferImage对象BufferedImage read = ImageIO.read(new File(imageSrc));int width = read.getWidth();int height = read.getHeight();//构建BufferImage对象BufferedImage newBufferImage = new BufferedImage(width * widthRatio, height * heigthRatio, BufferedImage.TYPE_INT_RGB);//绘制放大后的图片newBufferImage.getGraphics().drawImage(read, 0, 0, width * widthRatio, height * heigthRatio, null);//写入文件outputStream = new FileOutputStream(imageDest);ImageIO.write(newBufferImage, "jpg", outputStream);} catch (Exception e) {e.printStackTrace();}}
    
  4. 指定图形的长和宽

         /*** 指定图形的长和宽** @param iamgeSrc* @param imageDest* @param width* @param height* @throws IOException*/public static void resizeImage(String iamgeSrc, String imageDest, int width, int height) {FileOutputStream outputStream = null;try {//读入文件File file = new File(iamgeSrc);// 构造Image对象BufferedImage src = javax.imageio.ImageIO.read(file);// 放大边长BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//绘制放大后的图片tag.getGraphics().drawImage(src, 0, 0, width, height, null);outputStream = new FileOutputStream(imageDest);outputStream = new FileOutputStream(imageDest);ImageIO.write(tag, "jpg", outputStream);} catch (Exception e) {e.printStackTrace();}}
    
  5. 将图片附加到底图的正中央

    /*** 将图片附加到底图的正中央** @param negativeImagePath 底图路径* @param additionImagePath 附加图路径* @param imagePathDest     保存路径*/
    public static void mergeBothImageCenter(String negativeImagePath, String additionImagePath, String imagePathDest) {FileOutputStream outputStream = null;try {BufferedImage negativeBufferImge = ImageIO.read(new File(negativeImagePath));BufferedImage additionBufferImage = ImageIO.read(new File(additionImagePath));/***additionImagePath 绘制在 negativeImagePath 上的 中央区域*/negativeBufferImge.getGraphics().drawImage(additionBufferImage, (negativeBufferImge.getWidth() - additionBufferImage.getWidth()) / 2, (negativeBufferImge.getHeight() - additionBufferImage.getHeight()) / 2, null);outputStream = new FileOutputStream(imagePathDest);/*** 输出到文件*/ImageIO.write(negativeBufferImge, "jpg", outputStream);} catch (Exception e) {e.printStackTrace();}
    }
    
  6. 图片灰化操作

      /*** 图片灰化操作** @param srcImage 读取图片路径* @param toPath   写入灰化后的图片路径*/public static void grayImage(String srcImage, String toPath) {try {BufferedImage src = ImageIO.read(new File(srcImage));ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);ColorConvertOp op = new ColorConvertOp(cs, null);src = op.filter(src, null);ImageIO.write(src, "jpg", new File(toPath));} catch (Exception e) {e.printStackTrace();}}
    
  7. 在源图片上设置水印文字

        /*** 在源图片上设置水印文字* (AlphaComposite  设置透明度)* Graphics2D (绘制图片)** @param srcImagePath 原图片路径* @param alpha        透明度(0<alpha<1)* @param rotate       旋转的角度,以弧度为单位* @param font         字体(例如:宋体)* @param fontStyle    字体格式(例如:普通样式--Font.PLAIN、粗体--Font.BOLD )* @param fontSize:    字体大小* @param color        字体颜色(例如:黑色--Color.BLACK)* @param inputWords   输入显示在图片上的文字* @param x            文字显示起始的x坐标* @param y            文字显示起始的y坐标* @param imageFormat  文字显示起始的y坐标* @param toPath       写入图片路径*/public static void word2Image(@NonNull String srcImagePath, @NonNull float alpha, @NonNull double rotate, String font, int fontStyle, int fontSize, Color color,String inputWords, int x, int y, String imageFormat, String toPath) {FileOutputStream outputStream = null;try {BufferedImage bufferedImage = ImageIO.read(new File(srcImagePath));int width = bufferedImage.getWidth();int height = bufferedImage.getHeight();/*** 得到绘图对象 Graphics*/Graphics2D graphics = bufferedImage.createGraphics();/*** 原图像填充*/graphics.drawImage(bufferedImage, 0, 0, width, height, null, null);/*** 获取透明度对象AlphaComposite* static int  SRC将源色复制到目标色(Porter-Duff Source 规则)。static int    SRC_ATOP目标色中的源色部分将被合成到目标色中(Porter-Duff Source Atop Destination 规则)。static int    SRC_IN目标色中的源色部分将替换目标色(Porter-Duff Source In Destination 规则)。static int    SRC_OUT目标色以外的源色部分将替换目标色(Porter-Duff Source Held Out By Destination 规则)。static int    SRC_OVER在目标色之上合成源色(Porter-Duff Source Over Destination 规则)。*/AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);/*** 设置响应属性*/graphics.setComposite(alphaComposite);//设置文字字体名称、样式、大小graphics.setFont(new Font(font, fontStyle, fontSize));graphics.setColor(color);graphics.drawString(inputWords, x, y);//输入水印文字及其起始x、y坐标graphics.dispose();/*** 输出*/ImageIO.write(bufferedImage, imageFormat, new File(toPath));} catch (Exception e) {e.printStackTrace();}}
    
  8. 在源图像上设置图片水印

          /*** 在源图像上设置图片水印* ---- 当alpha==1时文字不透明(和在图片上直接输入文字效果一样)** @param srcImagePath    源图片路径* @param appendImagePath 水印图片路径* @param alpha           透明度* @param x               水印图片的起始x坐标* @param y               水印图片的起始y坐标* @param width           水印图片的宽度* @param height          水印图片的高度* @param imageFormat     图像写入图片格式* @param toPath          图像写入路径* @throws IOException*/public void alphaImage2Image(String srcImagePath, String appendImagePath,float alpha, int x, int y, int width, int height,String imageFormat, String toPath) throws IOException {FileOutputStream fos = null;try {BufferedImage image = ImageIO.read(new File(srcImagePath));//创建java2D对象Graphics2D g2d = image.createGraphics();//用源图像填充背景g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null, null);//设置透明度AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);g2d.setComposite(ac);//设置水印图片的起始x/y坐标、宽度、高度BufferedImage appendImage = ImageIO.read(new File(appendImagePath));g2d.drawImage(appendImage, x, y, width, height, null, null);g2d.dispose();fos = new FileOutputStream(toPath);ImageIO.write(image, imageFormat, fos);} catch (Exception e) {e.printStackTrace();} finally {if (fos != null) {fos.close();}}}
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java:图像(BufferedImage)色彩空间转换(灰度)暨获取图像矩阵数据byte[](sRGB/gray)

ColorConvertOp java.awt.image包下面有个类java.awt.image.ColorConvertOp,类名直译就是”颜色转换操作”。 顾名思义,它的作用就是将一个色彩空间(color space)的图像转换为另一个色彩空间的图像。有了这个神器我们就能轻易的将一张彩色图你像转换成灰度(gray)或其他色彩空间…

MyBatis-Plus updateById方法更新不了空字符串/null解决方法

最近遇到了Mybatis-Plus updateById()&#xff0c;更新某一个字段为null&#xff0c;却发现没有更新成功。记录一下 一、简介 因为最近在忙项目&#xff0c;好久都没有更新博客&#xff0c;最近在项目中刚好遇到一个问题&#xff0c;就是在使用MyBatis-Plus updateById&#…

Java 分割字符串的方法String.split()底层原理与使用

文章目录split()底层原理1.举例说明2.split源码分析3.API原解4.regex参数API原解5.limit参数介绍6.结果的验证7.此方法的使用split方法的使用split用法分析参数解释—regex参数解释—limit不同limit值的情况下的split结果验证扩展split()底层原理 1.举例说明 1.最普通的用法 …

HttpClient使用和详解

文章目录一、关于HttpClient二、HttpClient使用步骤详解1、创建一个HttpClient对象A、HttpCLientConnectionManagerB、HttpRoutePlannerC、RequestConfig2、创建一个Request对象3、执行Request请求4、处理response1&#xff09;关闭和entity相关的content stream2&#xff09;关…

你还在 Docker 中跑 MySQL?

容器的定义&#xff1a;容器是为了解决“在切换运行环境时&#xff0c;如何保证软件能够正常运行”这一问题。 目前&#xff0c;容器和 Docker依旧是技术领域最热门的词语&#xff0c;无状态的服务容器化已经是大势所趋&#xff0c;同时也带来了一个热点问题被大家所争论不以&…

使用mybatis-plus来自定义排序

需求&#xff1a; 先时间升序排序&#xff0c;相同的时间在按状态排序&#xff0c;状态的顺序为1 在线 4 潜伏 2 隐身 3 离开&#xff0c;状态相同在按姓名升序排序对排序好的数据进行分页运用mybatis-plus中QueryWrapper 1.导入依赖 <dependencies><dependency>…

Postman实现接口测试(附项目实战)

文章目录Postman实现接口测试1.Postman介绍和安装2. Postman安装2.1 安装方式2.2 安装步骤3. Postman入门示例Postman基本用法Postman高级用法1. 管理用例2. Postman断言3. 全局变量与环境变量5. Postman关联6. 批量执行测试用例7. 读取外部文件实现参数化Postman测试报告目标项…

Postman 使用教程详解

Postman页面 2、新建一个项目 直接点击左边栏上面的添加目录图标来新增一个根目录&#xff0c;这样就等于新建了一个项目&#xff0c;我们可以把一个项目或一个模块的用例都存放在这个目录之下&#xff0c;并且在根目录之下我们还可以在建立子目录来进行功能用例的细分&#…

Springboot dubbo @Service @Transactional 无法提供服务或者无法提供事务的解决办法

问题场景&#xff1a; 今天在springboot中集成spring事务的时候&#xff0c;遇到了一个大坑。如果&#xff08;springbootdubbo&#xff09;中添加 Service、Transactional 两个注解的时候&#xff0c;就不能进行dubbo服务注册了。 解决历程&#xff1a; 1&#xff0c;先是在…

什么是 serialVersionUID ? 序列化对象时必须提供 serialVersionUID 吗?

什么是 serialVersionUID &#xff1f; 序列化对象时必须提供 serialVersionUID 吗&#xff1f; 1&#xff0c;什么是 serialVersionUID &#xff1f; 顾名思义&#xff0c;serialVersionUID是序列化版本号。所有可序列化的类&#xff0c;都有一个静态serialVersionUID属性&a…

谈Java集合类的toArray()的小bug

谈Java集合类的toArray()的小bug toArray()方法 它的作用是将集合转换成数组。但是这个方法有一个弊端&#xff0c;当toArray()方法使用不当时会产生ClassCastException&#xff08;类转换异常&#xff09; public static void main(String[] args) {List<Integer> li…

Dubbo系统里面MultipartFile文件传输问题Dubbo文件上传/传输服务

今天遇到一个问题&#xff0c;在Controller 层里面&#xff0c;直接使用MultipartFile 来接收上传的图片&#xff0c;遇到几个坑。 一、在spring配置文件里面配置文件上传 <!--文件上传--><bean name"multipartResolver"class"org.springframework.web…

Dubbo2.7文档详解

本篇博文参考dubbo官方文档 本编博文参考javaguide之rpc 文章目录一.RPC1.1 什么是 RPC?1.2 为什么要用 RPC?1.3 RPC 能帮助我们做什么呢&#xff1f;1.4 RPC 的原理是什么?1.5 常见的 RPC 框架总结二.既有 HTTP ,为啥用 RPC 进行服务调用?2.1 RPC只是一种设计而已2.2 HTTP…

12nm 制程、Zen+ 微架构 AMD Ryzen 7 2700X 处理器详细测试 - 电脑领域 HKEPC Hard

12nm 制程、Zen 微架构 AMD Ryzen 7 2700X 处理器详细测试 代号 Pinnacle Ridge、AMD 第二代 Ryzen 处理器正式登场&#xff0c;基于经改良的 Zen 微架构&#xff0c;改善了 Cache 及记忆体延迟表现&#xff0c;更先进的 12nm LP 制程&#xff0c;令核心时脉进一步提升&#…

Java之Serializable接口实现序列化和反序列化实例以及部分序列化的四种方法

首先需要明确的概念: 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程持久化&#xff1a;将数据写入文件中长久保存的过程称之为持久化序列化主要目的&#xff1a;是…

win10死机频繁怎么解决

Windows 10已经推出好几年&#xff0c;系统趋于稳定&#xff0c;但依旧不是完美&#xff0c;蓝屏、死机状态还是会出现&#xff0c;只是概率降低了很多&#xff0c;如果你的电脑遇到了突然死机或者频繁卡死的情况&#xff0c;或许你应该考虑对电脑进行重置了。系统自带的恢复重…

Jar包常见的反编译工具介绍与使用

反编译JAR能干什么: 排查问题、分析商业软件代码逻辑&#xff0c;学习优秀的源码思路。 反编译工具介绍 JD-GUI 下载地址&#xff1a;http://java-decompiler.github.io/ 点评&#xff1a;支持的java版本不会太高&#xff0c;中文注释能够正常显示。 Luyten 下载地址&#…

400 bad request的原因意思和解决方法

我们的电脑在使用的过程中&#xff0c;有的小伙伴在上网的时候可能就遇到过系统提示&#xff1a;400 bad request的情况。据小编所知这种情况&#xff0c;大致意思就是出现了错误的请求或者请求不能满足。原因是因为我们请求的语法格式出现呢错误或者其他情况等等。我们可以通过…

重装系统win10提示磁盘布局不受UEFI固件支持怎么办

原因分析&#xff1a; Win10系统新增UEFI检测机制&#xff0c;在BIOS开启了UEFI时&#xff0c;如果硬盘分区表格式不是GPT&#xff0c;则会提示无法重装系统win10&#xff0c;也就是说UEFIGPT或LegacyMBR才能安装win10。 解决方法一&#xff1a;关闭UEFI 1、重启系统时按Del…

win7按f8后没有进入安全模式怎么解决

win7f8后没有进入安全模式&#xff0c;在正确操作按F8没有进入安全模式之后&#xff0c;不知道怎么解决win7按f8后没有进入安全模式怎么解决&#xff0c;其实非常的简单&#xff0c;下面来看看详细的解决方法吧。 win7按f8后没有进入安全模式怎么解决 第一种方法&#xff1a;…