Java实现图⽚合成的⽰例详解
⽬录
场景
环境
搭建
引⼊pom⽂件
定义核⼼接⼝ImageService
定义核⼼接⼝实现类ImageServiceImpl
测试ImageController
测试效果
总结
场景
前端有⼀个神器——canvas,这个画布标签可以处理各种图⽚的合成,可以精确到图⽚的具体坐标,加⽔印,去⽔印,简直不要太简单!那java后端可以处理吗?请⼤声的告诉他,能,必须能!今天⼩编告诉你⼀个神器——image-combiner,合成图⽚so easy!
环境
jdk1.8
spring boot
搭建
引⼊pom⽂件
<dependency>
<groupId>com.freewayso</groupId>
<artifactId>image-combiner</artifactId>
<version>2.2.0</version>
</dependency>
定义核⼼接⼝ImageService
public interface ImageService {
/**
* 简单图⽚聚合
* @param
* @return void
* @author liyajie
* @createTime 2021/12/17 9:54
**/
InputStream generateSimpleImage(String text, String bgImageUrl, String todoImage, String localPath, Boolean saveLocal, Boolean saveOss);
/**
* 复杂图⽚聚合
* @param
* @return void
* @author liyajie
* @createTime 2021/12/17 9:54
**/
InputStream generateComplexImage(String title, String content, String bgImageUrl, String qrCodeUrl, String productImageUrl, String waterMarkImageUrl, String avatarImageUrl, String localPath, Boolean saveLocal, Boolean saveOss);
}
定义核⼼接⼝实现类ImageServiceImpl
@Service
public class ImageServiceImpl implements ImageService {
@Override
public InputStream generateSimpleImage(String text, String bgImageUrl, String todoImage, String localPath, Boolean saveLocal, Boolean saveOss) {
InputStream is = null;
try{
// 合成器(指定背景图和输出格式,整个图⽚的宽⾼和相关计算依赖于背景图,所以背景图的⼤⼩是个基准)
ImageCombiner combiner = new ImageCombiner(bgImageUrl, OutputFormat.JPG);
// 加图⽚元素,第⼆个参数是左边界距,第三个参数是上边距
combiner.addImageElement(todoImage, 300, 300);
// 加⽂本元素,第⼆个参数是字体⼤⼩,第三个参数是左边界距,第四个参数是上边距
combiner.addTextElement(text, 60, 100, 960);
// 执⾏图⽚合并
combinerbine();
// 可以获取流(并上传oss等)
is = CombinedImageStream();
// 保存到本地
if(saveLocal){
combiner.save(localPath);
}
// 保存到oss
if(saveOss){
// TODO: 2021/12/17 保存到oss
}
}catch (Exception e){
e.printStackTrace();
}
return is;
}
@Override
public InputStream generateComplexImage(String title, String content, String bgImageUrl, String qrCodeUrl, String productImageUrl, String waterMarkImageUrl, String avatarImageUrl, String localPath, Boolean saveLocal, Boolean saveOss) { InputStream is = null;
try{
BufferedImage waterMark = ad(new URL(waterMarkImageUrl)); //⽔印图
BufferedImage avatar = ad(new URL(avatarImageUrl)); //头像
//创建合成器(指定背景图和输出格式,整个图⽚的宽⾼和相关计算依赖于背景图,所以背景图的⼤⼩是个基准)
ImageCombiner combiner = new ImageCombiner(bgImageUrl, 1500, 0, ZoomMode.Height, OutputFormat.JPG); //v1.1.4之后可以指定背景图新宽⾼了(不指定则默认⽤图⽚原宽⾼)
//针对背景和整图的设置
combiner.setBackgroundBlur(30); //设置背景⾼斯模糊(⽑玻璃效果)
combiner.setCanvasRoundCorner(100); //设置整图圆⾓(输出格式必须为PNG)
//标题(默认字体为阿⾥普惠、⿊⾊,也可以⾃⼰指定Font对象)
combiner.addTextElement(title, 0, 150, 1400)
.setCenter(true) //居中绘制(会忽略x坐标,改为⾃动计算)
.setAlpha(.8f) //透明度(0.0~1.0)
.setRotate(45) //旋转(0~360)
.d); //颜⾊
//内容(设置⽂本⾃动换⾏,需要指定最⼤宽度(超出则换⾏)、最⼤⾏数(超出则丢弃)、⾏⾼)
combiner.addTextElement(content, "微软雅⿊", 40, 150, 1480)
.setStrikeThrough(true) //删除线
.setAutoBreakLine(837, 2, 60); //⾃动换⾏
//商品图(设置坐标、宽⾼和缩放模式,若按宽度缩放,则⾼度按⽐例⾃动计算)
combiner.addImageElement(productImageUrl, 0, 160, 837, 0, ZoomMode.Width)
.setCenter(true) //居中绘制(会忽略x坐标,改为⾃动计算)
.setRoundCorner(46); //设置圆⾓
//头像(圆⾓设置⼀定的⼤⼩,可以把头像变成圆的)
combiner.addImageElement(avatar, 200, 1200)
.setRoundCorner(200); //圆⾓
//⽔印(设置透明度,0.0~1.0)
combiner.addImageElement(waterMark, 630, 1200)
.setAlpha(.8f) //透明度(0.0~1.0)
.setRotate(45) //旋转(0~360)
.setBlur(20); //⾼斯模糊(1~100)
/
/加⼊圆⾓矩形元素(版本>=1.2.0),作为⼆维码的底衬
combiner.addRectangleElement(138, 1707, 300, 300)
.setColor(Color.WHITE)
.setRoundCorner(50) //该值⼤于等于宽⾼时,就是圆形,如设为300
.setAlpha(.8f);
//⼆维码(强制按指定宽度、⾼度缩放)
combiner.addImageElement(qrCodeUrl, 138, 1707, 186, 186, ZoomMode.WidthHeight);
//价格(元素对象也可以直接new,然后⼿动加⼊待绘制列表)
TextElement textPrice = new TextElement("¥1290", 60, 230, 1300);
textPrice.d); //红⾊
textPrice.setStrikeThrough(true); //删除线
combiner.addElement(textPrice); //加⼊待绘制集合
//执⾏图⽚合并
combinerbine();
//可以获取流(并上传oss等)
is = CombinedImageStream();
//保存到本地
if(saveLocal){
combiner.save(localPath);
}
//保存到oss
if(saveOss){
/
/ TODO: 2021/12/17 保存到oss
}
}catch (Exception e){
java dubboe.printStackTrace();
}
return is;
}
}
测试ImageController
@RestController
@Slf4j
public class ImageController {
@Resource
HttpServletResponse response;
@Autowired
ImageService imageService;
/**
* 简单图⽚聚合
* @param
* @return void
* @author liyajie
* @createTime 2021/12/17 10:43
**/
@GetMapping("/createSimpleImage")
public void createSimpleImage(){
OutputStream os = null;
try {
String text = "周末⼤放送";
String bgImageUrl = "cube.elemecdn/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg";
String todoImage = "fuss10.elemecdn/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"; // 图⽚流
InputStream is = ateSimpleImage(text, bgImageUrl, todoImage,"",false,false);
BufferedImage image = ad(is);
response.setContentType("image/png");
os = OutputStream();
if (image != null) {
ImageIO.write(image, "png", os);
}
} catch (IOException e) {
e.printStackTrace();
<("获取图⽚异常{}",e.getMessage());
} finally {
if (os != null) {
try {
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
/**
* 复杂图⽚聚合
* @param
* @return void
* @author liyajie
* @createTime 2021/12/17 10:43
**/
@GetMapping("/createComplexImage")
public void createComplexImage(){
// 背景图
String bgImageUrl = "cube.elemecdn/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg";
// ⼆维码
String qrCodeUrl = "fuss10.elemecdn/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg";
// 商品图
String productImageUrl = "fuss10.elemecdn/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"; // ⽔印图
String waterMark = "fuss10.elemecdn/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg";
// 头像
String avatar = "fuss10.elemecdn/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg";
// 标题⽂本
String title = "# 最爱的家居";
// 内容⽂本
String content = "苏格拉底说:“如果没有那个桌⼦,可能就没有那个⽔壶”";
OutputStream os = null;
try{
// 图⽚流
InputStream is = ateComplexImage(title, content, bgImageUrl, qrCodeUrl, productImageUrl, waterMark, avatar,"",false,false); BufferedImage image = ad(is);
response.setContentType("image/png");
os = OutputStream();
if (image != null) {
ImageIO.write(image, "png", os);
}
}catch (Exception e){
e.printStackTrace();
}finally {
if (os != null) {
try {
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
测试效果
总结
从测试效果可以看到:
实现了图⽚和图⽚的合成
实现了图⽚和⽂字的合成
图⽚和⽂字的位置都可以使⽤参数来动态修改(具体可以看代码)
以上就是Java实现图⽚合成的⽰例详解的详细内容,更多关于Java图⽚合成的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论