JAVA图片工具类——大图上面添加小图、PNG转JPG、生成缩略

总结自网络JAVA图片工具类,无需引用其他依赖,包括以下方法:

  1. 在一张大图张添加小图和文字
  2. png转jpg
  3. 根据图片路径生成缩略图
package com.yf.exam.core.utils;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Arrays;

public class ImgUtil {

    private static String DEFAULT_PREVFIX = "thumb_";
    private static Boolean DEFAULT_FORCE = false;//建议该值为false

    /***
     * 在一张大图张添加小图和文字
     * @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();
        //适配小图尺寸
        // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
        int width = img.getWidth(null);
        int height = img.getHeight(null);
        int w = 150, h = 150;
        if ((width * 1.0) / w < (height * 1.0) / h) {
            if (width > w) {
                h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w / (width * 1.0)));
                System.out.println("change image's height, width:{" + w + "}, height:{" + h + "}.");
            }
        } else {
            if (height > h) {
                w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h / (height * 1.0)));
                System.out.println("change image's width,  width:{" + w + "}, height:{" + h + "}.");
            }
        }
        
        // 将小图片绘到大图片上指定的位置。 参数说明:小图,横坐标位移,纵坐标位移,缩放宽度,缩放高度,不知道-_-||
//        g.drawImage(img, sx, sy, null);
        //调整位置
        int bigWidth = buffImg.getWidth();
        sx = bigWidth - 220;
        g.drawImage(img, sx, sy, w, h, 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();
    }


    /**
     * png转jpg
     *
     * @param pngPath
     * @param jpgPath
     */
    public static void pngToJpg(String pngPath, String jpgPath) {
        BufferedImage bufferedImage;
        try {
            // read image file
            bufferedImage = ImageIO.read(new File(pngPath));
            // create a blank, RGB, same width and height, and a white
            // background
            BufferedImage newBufferedImage = new BufferedImage(
                    bufferedImage.getWidth(), bufferedImage.getHeight(),
                    BufferedImage.TYPE_INT_RGB);
            // TYPE_INT_RGB:创建一个RBG图像,24位深度,成功将32位图转化成24位
            newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0,
                    Color.WHITE, null);
            // write to jpeg file
            ImageIO.write(newBufferedImage, "jpg", new File(jpgPath));
            System.out.println("Done");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * <p>Title: thumbnailImage</p>
     * <p>Description: 根据图片路径生成缩略图 </p>
     *
     * @param imagePath 原图片路径
     * @param w         缩略图宽
     * @param h         缩略图高
     * @param prevfix   生成缩略图的前缀
     * @param force     是否强制按照宽高生成缩略图(如果为false,则生成最佳比例缩略图)
     */
    public static void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force) {
        File imgFile = new File(imagePath);
        if (imgFile.exists()) {
            try {
                // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
                String types = Arrays.toString(ImageIO.getReaderFormatNames());
                String suffix = null;
                // 获取图片后缀
                if (imgFile.getName().indexOf(".") > -1) {
                    suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
                }
                // 类型和图片后缀全部小写,然后判断后缀是否合法
                if (suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0) {
                    System.out.println("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
                    return;
                }
                System.out.println("target image's size, width:{" + w + "}, height:{" + h + "}.");
                Image img = ImageIO.read(imgFile);
                if (!force) {
                    // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
                    int width = img.getWidth(null);
                    int height = img.getHeight(null);
                    if ((width * 1.0) / w < (height * 1.0) / h) {
                        if (width > w) {
                            h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w / (width * 1.0)));
                            System.out.println("change image's height, width:{" + w + "}, height:{" + h + "}.");
                        }
                    } else {
                        if (height > h) {
                            w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h / (height * 1.0)));
                            System.out.println("change image's width,  width:{" + w + "}, height:{" + h + "}.");
                        }
                    }
                }
                BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                Graphics g = bi.getGraphics();
                g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
                g.dispose();
                String p = imgFile.getPath();
                // 将图片保存在原目录并加上前缀
                ImageIO.write(bi, suffix, new File(p.substring(0, p.lastIndexOf(File.separator)) + File.separator + prevfix + imgFile.getName()));
                System.out.println("缩略图在原路径下生成成功");
            } catch (IOException e) {
                System.out.println("generate thumbnail image failed." + e);
            }
        } else {
            System.out.println("the image is not exist.");
        }
    }


    public static void main(String[] args) throws IOException {
        String bigImg = "/Users/chaojiwudi/Desktop/10001.png";
//        String smallImg = "/Users/chaojiwudi/Desktop/testimg/3299dbcd591742e3b24695e54f9ec1db.png";
        String smallImg = "/Users/chaojiwudi/Desktop/testimg/332.jpg";
        String content = "好久不见,你还好吗";
        String outPath = "/Users/chaojiwudi/Desktop/testimg/addImg111.jpg";

//        thumbnailImage("/Users/chaojiwudi/Desktop/testimg/62796873274c4ad784f0754dd264596a.jpg", 200, 600, DEFAULT_PREVFIX, DEFAULT_FORCE);
        //先将大图转成jpg
        pngToJpg(bigImg, outPath);
        try {
            bigImgAddSmallImgAndText(outPath, smallImg, 550, 90, null, 200, 200, outPath);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值