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类常用方法以及图片操作
常用方法
读
从图中可以看到有三个重载的方法,返回的类型都是BufferedImage
实际操作
@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();}}
写
可以看到常见的写方法如上。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 文档的基础上实现。详细看跳转查看
将指定颜色变透明 只能保存 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;}
按倍率缩小图片
/*** 按倍率缩小图片** @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();}}
按比例放大图片
/*** 按比例方法图片** @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();}}
指定图形的长和宽
/*** 指定图形的长和宽** @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();}}
将图片附加到底图的正中央
/*** 将图片附加到底图的正中央** @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();} }
图片灰化操作
/*** 图片灰化操作** @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();}}
在源图片上设置水印文字
/*** 在源图片上设置水印文字* (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();}}
在源图像上设置图片水印
/*** 在源图像上设置图片水印* ---- 当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类说明相关推荐
- ImageIo类常用方法以及图片操作
ImageIo类常用方法以及图片操作 文章目录 ImageIo类常用方法以及图片操作 常用方法 图片操作 结尾 常用方法 读 从图中可以看到有三个重载的方法,返回的类型都是BufferedImage ...
- JAVA实现彩色图片转黑白图片 (ImageIO类)
import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java. ...
- ImageIO类的使用
重点内容 (一) How to read an image from file or URL? 从本地文本读取图片 File sourceimage = new File("c:\\mypi ...
- 记录小问题:在使用java的ImageIO类来操作图片的时候,有时候图片生成出来背景失真,变成了橙红色
解决完突然发现复现不出来了.0.0 不贴问题图了,直接两行代码解决. //修复图片失真问题BufferedImage newBufferedImage = new BufferedImage(back ...
- java imageio_Java使用imageio 读写图像
Java中进行图像I/O(即读图片和写图片,不涉及到复杂图像处理)有三个方法: JAI 中的 Image I/O Tools,支持更多图片类型,例如JPEG-LS, JPEG2000, 和 TIFF. ...
- java import imageio_是否可以使用Java ImageIO从InputStream读取多个...
是的,可以从(单个)InputStream读取多个图像. 我认为最明显的解决方案是使用一种文件格式,该文件格式已广泛支持多种图像,例如TIFF.即使ImageIO类没有任何便利的方法,如ImageIO ...
- java ImageIO处理
avax.imageio 使用 ImageIO 类的静态方法可以执行许多常见的图像 I/O 操作. 此包包含一些基本类和接口,有的用来描述图像文件内容(包括元数据和缩略图)(IIOImage): 有的 ...
- Java imageio底层_java - Java中的ImageIO问题 - 堆栈内存溢出
我遇到的问题是,我在JAVA的Applet Viewer中看不到ImageIO类引用的任何图片. 我正在关注在线教程,但尚未收到作者的回信-他的页面上有类似的问题他没有回答,所以我假设他正在尝试自己解 ...
- 仿雷电——飞机大战类游戏Ⅰ
文章目录 简介 第一阶段:游戏界面的绘画及图片加载 1.添加背景图片 第二阶段:使用多线程让动画动起来 第三阶段:键盘操控飞机 第四阶段:炮弹和飞机碰撞,爆炸 第五阶段:显示分数 简介 我们仿照 QQ ...
最新文章
- tf.shape()
- 2020年人工神经网络第二次作业-参考答案第一题
- Jenkins(二)
- 私有云和公有云的区别_如何理解公有云和私有云
- hibernate实体的几种状态
- 六. 异常处理9.finally块
- php中使用hash_hmac函数实现HMAC-SHA1签名算法的来龙去脉
- 利用python爬虫(part3)--正则表达式
- ad20中怎么多选操作改层_在操作系统中CPU是怎么调度的
- 云文件共享将为安全团队带来新的难题
- Django项目部署到Linux后,上传文件的时候,mkdirs创建目录OSError - Errno 13 Permission denied
- MySQL,优化查询的方法
- oracle subset-superset pairs,Oracle 字符集
- pytorch: 将一序列操作串联
- 魔方机器人之下位机编程---------舵机控制
- 电容笔和触控笔哪个好?2022年电容笔推荐选购指南
- 计算机之父的童年故事教案,《计算机之父的童年故事》教学设计
- QT 使用QModbus类实现modbus TCP踩过的坑
- Java项目:小区物业管理系统(java+springboot+thymeleaf+maven+Mysql)
- 备份微信聊天记录到电脑上,并且可以随时导回
热门文章
- 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
- 中国大学数据科学与大数据技术专业排名!2021软科排名
- 【前端17_JS】ES 6:Let 、Const、对象冻结、解构赋值、暂时性死区 TDZ、惰性求值、模板字符串
- html ul怎么去掉内边距,ul默认有内边距
- Java实现 四舍五入取整到百位 四舍五入取整到千位 数字取整到千位 数字取值到千位 数字取整到百位 数字取值到百位
- 电信物联网平台SOTA升级(软件升级)的全流程说明
- IMDG产品功能扩展
- 10分钟学会go module
- java 系统容量预估
- 示波器学习(一):示波器的作用、类型和基本结构