imageio是主要处理图片信息的包,提供了可以进行图片的读写 修改大小 、缩放、转换等操作的类。
先来了解一下本次练习需要用到的imageio包含的类:
现在开始进行为图片添加文字和小图片练习:
基本思路:
1. 获取ImageReader对象
2. 创建ImageInputStream,和关联ImageReader对象关联
3. 获取BufferedImage对象和画笔Graphics2D对象
4. 获取小图片并画入大图片中
5. 设置字体和画笔颜色
6. 获得字体的逻辑边界Rectangle2D对象
7. 获得字体开始的坐标
8. 绘制文字
9. 获取ImageWriter对象和ImageOutputStream对象
10. 关联ImageOutputStream,输出图片
具体代码:
File file = new File("H:\\图片\\wallhaven-45wr51.jpg");
//返回一个 Iterator包含所有当前注册的 ImageReader,声称能够解码命名格式。
Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
//获取ImageReader对象
ImageReader reader = (ImageReader)readers.next();
ImageInputStream imageInputStream1 = ImageIO.createImageInputStream(file);
//关联input
reader.setInput(imageInputStream1, true); //一张为true,多张为false
//获取BufferedImage
BufferedImage bfimage = reader.read(0);
//获取画笔对象
Graphics2D graphics2D = (Graphics2D) bfimage.getGraphics();
//获取小图片
ImageIcon imgIcon = new ImageIcon("d:/image.jpg");
Image img = imgIcon.getImage();
//将小图片画入大图片
graphics2D.drawImage(img,reader.getWidth(0)/2,reader.getHeight(0)/2,null);
//添加文字
Font font = new Font("微软雅黑", Font.BOLD, 20);//设置字体
graphics2D.setPaint(Color.RED); //设置画笔颜色
FontRenderContext context = graphics2D.getFontRenderContext();
Rectangle2D bounds = font.getStringBounds("你好啊", context); //返回指定的逻辑边界
//获取字体开始的坐标
double x = (reader.getWidth(0) - bounds.getWidth()) / 2;
double y = (reader.getHeight(0) - bounds.getHeight()) / 2;
double ascent = -bounds.getY();
double baseY = y + ascent;
//添加文字
graphics2D.drawString("你好啊", (int)x, (int)baseY);
//输出图片路径
File outPath = new File("d:/image1.jpg");
//获取ImageWriter对象
ImageWriter writer = ImageIO.getImageWriter(reader);
//获取ImageOutputStream对象
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(outPath);
//关联ImageOutputStream
writer.setOutput(imageOutputStream);
//输出图片
writer.write(bfimage);
运行效果:
学习总结:
ImageIO类 提供了静态的 read和write方法来进行简单的图像IO操作。
如果想实现复杂的工作,就要使用到类ImageReader 和 ImageWriter。ImageReader 和 ImageWriter对象都需要一个输入(出)源进行关联。
使用 ImageReader reader .getDefaultReadParam()可以获取 ImageReadParam 对象,此对象可以指定区域(对某一区域进行操作)和抽样因子。
BufferedImage bi = reader.read(imageIndex, param);
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}