总结自网络JAVA图片工具类,无需引用其他依赖,包括以下方法:
- 在一张大图张添加小图和文字
- png转jpg
- 根据图片路径生成缩略图
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();
}
}
/**
* Title: thumbnailImage
* Description: 根据图片路径生成缩略图
*
* @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();
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)