最近的项目中遇到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();}}}
    

ImageIO类说明相关推荐

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

    ImageIo类常用方法以及图片操作 文章目录 ImageIo类常用方法以及图片操作 常用方法 图片操作 结尾 常用方法 读 从图中可以看到有三个重载的方法,返回的类型都是BufferedImage ...

  2. JAVA实现彩色图片转黑白图片 (ImageIO类)

    import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java. ...

  3. ImageIO类的使用

    重点内容 (一) How to read an image from file or URL? 从本地文本读取图片 File sourceimage = new File("c:\\mypi ...

  4. 记录小问题:在使用java的ImageIO类来操作图片的时候,有时候图片生成出来背景失真,变成了橙红色

    解决完突然发现复现不出来了.0.0 不贴问题图了,直接两行代码解决. //修复图片失真问题BufferedImage newBufferedImage = new BufferedImage(back ...

  5. java imageio_Java使用imageio 读写图像

    Java中进行图像I/O(即读图片和写图片,不涉及到复杂图像处理)有三个方法: JAI 中的 Image I/O Tools,支持更多图片类型,例如JPEG-LS, JPEG2000, 和 TIFF. ...

  6. java import imageio_是否可以使用Java ImageIO从InputStream读取多个...

    是的,可以从(单个)InputStream读取多个图像. 我认为最明显的解决方案是使用一种文件格式,该文件格式已广泛支持多种图像,例如TIFF.即使ImageIO类没有任何便利的方法,如ImageIO ...

  7. java ImageIO处理

    avax.imageio 使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作. 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage): 有的 ...

  8. Java imageio底层_java - Java中的ImageIO问题 - 堆栈内存溢出

    我遇到的问题是,我在JAVA的Applet Viewer中看不到ImageIO类引用的任何图片. 我正在关注在线教程,但尚未收到作者的回信-他的页面上有类似的问题他没有回答,所以我假设他正在尝试自己解 ...

  9. 仿雷电——飞机大战类游戏Ⅰ

    文章目录 简介 第一阶段:游戏界面的绘画及图片加载 1.添加背景图片 第二阶段:使用多线程让动画动起来 第三阶段:键盘操控飞机 第四阶段:炮弹和飞机碰撞,爆炸 第五阶段:显示分数 简介 我们仿照 QQ ...

最新文章

  1. tf.shape()
  2. 2020年人工神经网络第二次作业-参考答案第一题
  3. Jenkins(二)
  4. 私有云和公有云的区别_如何理解公有云和私有云
  5. hibernate实体的几种状态
  6. 六. 异常处理9.finally块
  7. php中使用hash_hmac函数实现HMAC-SHA1签名算法的来龙去脉
  8. 利用python爬虫(part3)--正则表达式
  9. ad20中怎么多选操作改层_在操作系统中CPU是怎么调度的
  10. 云文件共享将为安全团队带来新的难题
  11. Django项目部署到Linux后,上传文件的时候,mkdirs创建目录OSError - Errno 13 Permission denied
  12. MySQL,优化查询的方法
  13. oracle subset-superset pairs,Oracle 字符集
  14. pytorch: 将一序列操作串联
  15. 魔方机器人之下位机编程---------舵机控制
  16. 电容笔和触控笔哪个好?2022年电容笔推荐选购指南
  17. 计算机之父的童年故事教案,《计算机之父的童年故事》教学设计
  18. QT 使用QModbus类实现modbus TCP踩过的坑
  19. Java项目:小区物业管理系统(java+springboot+thymeleaf+maven+Mysql)
  20. 备份微信聊天记录到电脑上,并且可以随时导回

热门文章

  1. 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
  2. 中国大学数据科学与大数据技术专业排名!2021软科排名
  3. 【前端17_JS】ES 6:Let 、Const、对象冻结、解构赋值、暂时性死区 TDZ、惰性求值、模板字符串
  4. html ul怎么去掉内边距,ul默认有内边距
  5. Java实现 四舍五入取整到百位 四舍五入取整到千位 数字取整到千位 数字取值到千位 数字取整到百位 数字取值到百位
  6. 电信物联网平台SOTA升级(软件升级)的全流程说明
  7. IMDG产品功能扩展
  8. 10分钟学会go module
  9. java 系统容量预估
  10. 示波器学习(一):示波器的作用、类型和基本结构