图片处理工具类

说明

这次工作遇到自定义生成图片然后分享,图片生成原理不甚了解,先把工具类记录下来,以后再看看原理。方法都是从网上找的,各种各样的地方拼起来的,自己项目中使用,都可以正常运行的。

自定义对象

自定义对象,方便传值,也可以不使用。

ImageShare

package model;

import lombok.Builder;
import lombok.Data;

import java.util.List;

/**
 * 图片分享数据
 * @author wuhenjian
 * @date 2019/4/2 11:33
 */
@Builder
@Data
public class ImageShare {

	/** 背景图,不允许为空,坐标值可不填 */
	private ImageFormat bg;

	/** 背景图上增加的图片 */
	List<ImageFormat> imageFormatList;

	/** 图片中的文字 */
	private List<TextFont> textFontList;
}

ImageFormat

package model;

import lombok.Builder;
import lombok.Data;

import java.io.InputStream;

/**
 * 图片格式对象
 * @author wuhenjian
 * @date 2019/4/2 11:44
 */
@Data
@Builder
public class ImageFormat {

	/** 图片流 */
	private InputStream image;

	/** 图片放置位置x */
	private int x;

	/** 图片放置位置y */
	private int y;

	/** 图片格式 */
	private String type;
}

TextFont

package model;

import lombok.Builder;
import lombok.Data;

import java.awt.*;

/**
 * @author wuhenjian
 * @date 2019/4/2 11:35
 */
@Data
@Builder
public class TextFont {

	/** 文字 */
	private String text;

	/** 位置x */
	private int x;

	/** 位置y */
	private int y;

	/** 格式 */
	private Font font;

	/** 颜色 */
	private Color color;
}

图片工具类

方法介绍就看代码注释了。

使图片保持透明

主要是针对PNG格式的图片,保留图片原有的透明格式。

	/**
	 * 使图片保持透明
	 * @param source 原图
	 * @return 设置为透明之后的图片
	 */
	private static BufferedImage transparent(BufferedImage source) {
		BufferedImage target = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_INT_BGR)
				.createGraphics()
				.getDeviceConfiguration()
				.createCompatibleImage(source.getWidth(), source.getHeight(), Transparency.TRANSLUCENT);
		Graphics2D graphics = target.createGraphics();
		graphics.drawImage(source, 0, 0, null);
		return target;
	}

图片上增加图片

	/**
	 * 图片上增加图片
	 * @param bg 底片
	 * @param imageFormat 增加的图片
	 */
	public static void addImage(BufferedImage bg, ImageFormat imageFormat) throws IOException {
		// 以底片构建绘图对象
		Graphics2D bgGraphics = bg.createGraphics();
		// 构建新增的图片
		BufferedImage image = transparent(ImageIO.read(imageFormat.getImage()));
		// 新建图片宽高
		int width = image.getWidth();
		int height = image.getHeight();
		// 增加图片
		bgGraphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP));
		bgGraphics.drawImage(image, imageFormat.getX(), imageFormat.getY(), width, height, null);
		bgGraphics.dispose();
	}

图片上增加文字

	public static void addText(BufferedImage bg, TextFont textFont) {
		// 以底片构建绘图对象
		Graphics2D bgGraphics = bg.createGraphics();
		// 以底片绘图
		bgGraphics.setColor(textFont.getColor());
		bgGraphics.setFont(textFont.getFont());
		bgGraphics.drawString(textFont.getText(), textFont.getX(), textFont.getY());
		bgGraphics.dispose();
	}

按照宽高缩放图片

	/**
	 * 按照宽高缩放图片
	 * @param source 原图片
	 * @param width 宽
	 * @param height 高
	 * @return 缩放后的图片
	 * @throws IOException IO异常
	 */
	public static InputStream zoom(InputStream source, int width, int height) throws IOException {
		Image image = ImageIO.read(source).getScaledInstance(width, height, Image.SCALE_DEFAULT);
		BufferedImage bi = transparent(new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB));
		Graphics2D graphics = bi.createGraphics();
		graphics.drawImage(image, 0, 0, null);
		graphics.dispose();

		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ImageIO.write(bi, "png", byteArrayOutputStream);
		return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
	}

裁剪图片

	/**
	 * 裁剪图片
	 * @param source 原图
	 * @param startX 开始X点
	 * @param startY 开始Y点
	 * @param endX 结束X点
	 * @param endY 结束Y点
	 * @return 裁剪后的图片
	 */
	public static BufferedImage cut(BufferedImage source, int startX, int startY, int endX, int endY) {
		int width = source.getWidth();
		int height = source.getHeight();
		if (startX < 0) {
			startX = 0;
		}
		if (startY < 0) {
			startY = 0;
		}
		if (endX < 0) {
			endX = width;
		}
		if (endY < 0) {
			endY = height;
		}
		BufferedImage target = transparent(new BufferedImage(endX - startX, endY - startY, BufferedImage.TYPE_INT_RGB));
		for (int x = startX; x < endX; ++x) {
			for (int y = startY; y < endY; ++y) {
				int rgb = source.getRGB(x, y);
				target.setRGB(x - startX, y - startY, rgb);
			}
		}
		return target;
	}

拼接图片

	/**
	 * 将图片按照类型拼接在一起,横向拼接时高度必须一致,纵向拼接时宽度必须一致
	 * @param type 1-纵向,2-横向
	 * @param bufferedImages 图片
	 * @return 拼接成的图片
	 */
	public static BufferedImage join(int type, BufferedImage... bufferedImages) throws Exception {
		if (type != 1 && type != 2) {
			throw new Exception("拼接类型错误,type=" + type);
		}
		if (bufferedImages == null || bufferedImages.length == 0) {
			return null;
		}
		// true-纵向,false-横向
		boolean direction = type == 1;
		// 图片总宽度
		int allWidth = 0;
		// 图片总高度
		int allHeight = 0;

		if (direction) {
			allWidth = bufferedImages[0].getWidth();
			for (BufferedImage bufferedImage : bufferedImages) {
				allHeight += bufferedImage.getHeight();
			}
		} else {
			allHeight = bufferedImages[0].getHeight();
			for (BufferedImage bufferedImage : bufferedImages) {
				allWidth += bufferedImage.getWidth();
			}
		}

		// 新图片
		BufferedImage target = transparent(new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_INT_RGB));
		Graphics graphics = target.createGraphics();
		int distance = 0;
		if (direction) {
			for (BufferedImage bufferedImage : bufferedImages) {
				graphics.drawImage(bufferedImage, 0, distance, null);
				distance += bufferedImage.getHeight();
			}
		} else {
			for (BufferedImage bufferedImage : bufferedImages) {
				graphics.drawImage(bufferedImage, distance, 0, null);
				distance += bufferedImage.getWidth();
			}
		}
		graphics.dispose();
		return target;
	}

生成分享图片

	/**
	 * 输出分享图片的流
	 * @param imageShare 图片数据
	 */
	public static InputStream createShare(ImageShare imageShare) throws IOException {
		BufferedImage bg = transparent(ImageIO.read(imageShare.getBg().getImage()));
		// 向背景图上添加图片
		for (ImageFormat imageFormat : imageShare.getImageFormatList()) {
			// 不为空则添加图片
			if (imageFormat.getImage() != null) {
				addImage(bg, imageFormat);
			}
		}
		// 添加文字
		for (TextFont textFont : imageShare.getTextFontList()) {
			if (StringUtil.isNotBlank(textFont.getText())) {
				addText(bg, textFont);
			}
		}
		imageShare.getTextFontList().forEach(textFont -> addText(bg, textFont));
		// 将BufferedImage转换为InputStream
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		ImageIO.write(bg, imageShare.getBg().getType(), byteArrayOutputStream);
		return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
	}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值