java实现在一张大图片上添加小图及文字

 更新时间:2021年11月12日 11:17:19   作者:Mr_LGZ  
这篇文章主要介绍了java实现在一张大图上添加小图及文字,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

在一张大图上添加小图及文字

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.ParseException;
public class ImgUtil {
    public static void main(String[] args) throws ParseException {
        String bigImg = "C:\\Users\\langz\\Desktop\\ffff\\big.jpg";
        String smallImg = "C:\\Users\\langz\\Desktop\\ffff\\small.jpg";
        String content = "好久不见,你还好吗";
        String outPath = "C:\\Users\\langz\\Desktop\\ffff\\" + System.currentTimeMillis() + ".jpg";
        try {
            bigImgAddSmallImgAndText(bigImg, smallImg, 500, 500, null, 200, 200, outPath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /***
     * 在一张大图张添加小图和文字
     * @param bigImgPath 大图的路径
     * @param smallImgPath 小图的路径
     * @param sx    小图在大图上x抽位置
     * @param sy    小图在大图上y抽位置
     * @param content   文字内容
     * @param cx    文字在大图上y抽位置
     * @param cy    文字在大图上y抽位置
     * @param outPathWithFileName 结果输出路径
     */
    public static void bigImgAddSmallImgAndText(String bigImgPath
            , String smallImgPath, int sx, int sy
            , String content, int cx, int cy
            , String outPathWithFileName) throws IOException {
        //主图片的路径
        InputStream is = new FileInputStream(bigImgPath);
        //通过JPEG图象流创建JPEG数据流解码器
        JPEGImageDecoder jpegDecoder = JPEGCodec.createJPEGDecoder(is);
        //解码当前JPEG数据流,返回BufferedImage对象
        BufferedImage buffImg = jpegDecoder.decodeAsBufferedImage();
        //得到画笔对象
        Graphics g = buffImg.getGraphics();
        //小图片的路径
        ImageIcon imgIcon = new ImageIcon(smallImgPath);
        //得到Image对象。
        Image img = imgIcon.getImage();
        //将小图片绘到大图片上,5,300 .表示你的小图片在大图片上的位置。
        g.drawImage(img, sx, sy, null);
        //设置颜色。
        g.setColor(Color.WHITE);
        //最后一个参数用来设置字体的大小
        if (content != null) {
            Font f = new Font("宋体", Font.PLAIN, 25);
            Color mycolor = Color.red;//new Color(0, 0, 255);
            g.setColor(mycolor);
            g.setFont(f);
            g.drawString(content, cx, cy); //表示这段文字在图片上的位置(cx,cy) .第一个是你设置的内容。
        }
        g.dispose();
        OutputStream os = new FileOutputStream(outPathWithFileName);
        //创键编码器,用于编码内存中的图象数据。
        JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
        en.encode(buffImg);
        is.close();
        os.close();
    }
}  

实现给图片添加水印

某些应用场景下需要对图片加上水印防止盗用,例如微博用户图片。Java中实现添加水印需要用到BufferedImage、Graphics2D 和ImageIO类。

1. 添加文字水印

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
/**
 * 添加文字水印
 *
 * @author Ricky Fung
 */
public class TextMarkProcessor {
    /**
     * @param args
     */
    public static void main(String[] args) {
        new TextMarkProcessor().testTextMark();
    }
    public void testTextMark() {
        File srcImgFile = new File("D:/test/desktop.png");
        String logoText = "[ 天使的翅膀 ]";
        File outputRotateImageFile = new File("D:/test/desktop_text_mark.jpg");
        createWaterMarkByText(srcImgFile, logoText, outputRotateImageFile, 0);
    }
    public void createWaterMarkByText(File srcImgFile, String logoText,
                                             File outputImageFile, double degree) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(srcImgFile);
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = buffImg.createGraphics();
            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null),
                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            if (degree>0) {
                graphics.rotate(Math.toRadians(degree),
                        (double) buffImg.getWidth() / 2,
                        (double) buffImg.getHeight() / 2);
            }
            graphics.setColor(Color.RED);
            graphics.setFont(new Font("宋体", Font.BOLD, 36));
            float alpha = 0.8f;
            graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    alpha));
            graphics.drawString(logoText, buffImg.getWidth()/3, buffImg.getHeight()/2);
            graphics.dispose();
            os = new FileOutputStream(outputImageFile);
            // 生成图片
            ImageIO.write(buffImg, "JPG", os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

2. 添加图片水印

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
/**
 * 添加图片水印
 *
 * @author Ricky Fung
 */
public class PictureMarkProcessor {
    /**
     * @param args
     */
    public static void main(String[] args) {
        new PictureMarkProcessor().testPictureMark();
    }
    public void testPictureMark() {
        File srcImageFile = new File("D:/test/desktop.png");
        File logoImageFile = new File("D:/test/tools.png");
        File outputRoateImageFile = new File("D:/test/desktop_pic_mark.jpg");
        createWaterMarkByIcon(srcImageFile, logoImageFile, outputRoateImageFile, 0);
    }
    public void createWaterMarkByIcon(File srcImageFile, File logoImageFile,
                                             File outputImageFile, double degree) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(srcImageFile);
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            Graphics2D graphics = buffImg.createGraphics();
            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null),
                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            ImageIcon logoImgIcon = new ImageIcon(ImageIO.read(logoImageFile));
            Image logoImg = logoImgIcon.getImage();
            //旋转
            if (degree>0) {
                graphics.rotate(Math.toRadians(degree),
                        (double) buffImg.getWidth() / 2,
                        (double) buffImg.getWidth() / 2);
            }
            float alpha = 0.8f; // 透明度
            graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            //水印 的位置
            graphics.drawImage(logoImg, buffImg.getWidth()/3, buffImg.getHeight()/2, null);
            graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            graphics.dispose();
            os = new FileOutputStream(outputImageFile);
            // 生成图片
            ImageIO.write(buffImg, "JPG", os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

实现效果如下:

原图:

这里写图片描述

加文字水印:

这里写图片描述

加图片水印:

这里写图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Java动态加载数据库驱动

    详解Java动态加载数据库驱动

    本篇文章主要介绍了详解Java动态加载数据库驱动,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Hibernate双向多对多映射关系配置代码实例

    Hibernate双向多对多映射关系配置代码实例

    这篇文章主要介绍了Hibernate双向多对多映射关系配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • MyBatisPlus TypeHandler自定义字段类型转换Handler

    MyBatisPlus TypeHandler自定义字段类型转换Handler

    这篇文章主要为大家介绍了MyBatisPlus TypeHandler自定义字段类型转换Handler示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 一文教你搞懂SpringBoot自定义拦截器的思路

    一文教你搞懂SpringBoot自定义拦截器的思路

    在开发中,都离不开拦截器的使用,比如说在开发登录功能时,实现权限管理功能时等,这篇文章主要带大家使用SpringBoot梳理自定义拦截器的思路,需要的可以参考一下
    2023-08-08
  • spring boot中的静态资源加载处理方式

    spring boot中的静态资源加载处理方式

    这篇文章主要介绍了spring boot中的静态资源加载处理方式,需要的朋友可以参考下
    2017-04-04
  • java实现自定义表格渲染和编辑

    java实现自定义表格渲染和编辑

    这篇文章主要为大家详细介绍了java如何实现自定义表格渲染和编辑,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • java数据结构之插入排序

    java数据结构之插入排序

    这篇文章主要为大家详细介绍了java数据结构之插入排序的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 基于mybatis逆向工程的使用步骤详解

    基于mybatis逆向工程的使用步骤详解

    下面小编就为大家带来一篇基于mybatis逆向工程的使用步骤详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Kafka日志清理实现详细过程讲解

    Kafka日志清理实现详细过程讲解

    这篇文章主要为大家介绍了Kafka日志清理实现详细过程讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Springboot中的@Conditional注解详解

    Springboot中的@Conditional注解详解

    这篇文章主要介绍了Springboot中的@Conditional注解详解,@Conditional来源于spring-context包下的一个注解,Conditional中文是条件的意思,@Conditional注解它的作用是按照一定的条件进行判断,满足条件给容器注册bean,需要的朋友可以参考下
    2023-09-09

最新评论