Java imageIO实现图片添加文字和小图片

zhy

发布于 2020.02.16 22:25 阅读 2678 评论 0

    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);