package io.github.util.sketch.img;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.resource.Resource;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.*;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URL;
import java.nio.file.Path;
/**
* 图像编辑器
* <br/>修改了hutool的pressText和pressImage中x,y的代码,重新定义了xy的算法
*
* @author Created by 思伟 on 2020/3/4
*/
@SuppressWarnings("AlibabaAvoidDoubleOrFloatEqualCompare")
public class Img implements Serializable {
private static final long serialVersionUID = 1L;
private BufferedImage srcImage;
private Image targetImage;
/**
* 目标图片文件格式,用于写出
*/
private String targetImageType;
/**
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
*/
private boolean positionBaseCentre = true;
/**
* 图片输出质量,用于压缩
*/
private float quality = -1;
/**
* 创建空白画布
*
* @param width 画布的长
* @param height 画布的宽
* @param imageType 图片的类型
* @return
*/
public static Img create(int width, int height, int imageType, Color backgroundColor) {
BufferedImage srcImage = new BufferedImage(width, height, imageType);
Graphics2D g2 = srcImage.createGraphics();
g2.setBackground(backgroundColor);
g2.clearRect(0, 0, width, height);
g2.dispose();
return new Img(srcImage);
}
/**
* 从Path读取图片并开始处理
*
* @param imagePath 图片文件路径
* @return {@link Img}
*/
public static Img from(Path imagePath) {
return from(imagePath.toFile());
}
/**
* 从文件读取图片并开始处理
*
* @param imageFile 图片文件
* @return {@link Img}
*/
public static Img from(File imageFile) {
return new Img(ImgUtil.read(imageFile));
}
/**
* 从资源对象中读取图片并开始处理
*
* @param resource 图片资源对象
* @return {@link Img}
* @since 4.4.1
*/
public static Img from(Resource resource) {
return from(resource.getStream());
}
/**
* 从流读取图片并开始处理
*
* @param in 图片流
* @return {@link Img}
*/
public static Img from(InputStream in) {
return new Img(ImgUtil.read(in));
}
/**
* 从ImageInputStream取图片并开始处理
*
* @param imageStream 图片流
* @return {@link Img}
*/
public static Img from(ImageInputStream imageStream) {
return new Img(ImgUtil.read(imageStream));
}
/**
* 从URL取图片并开始处理
*
* @param imageUrl 图片URL
* @return {@link Img}
*/
public static Img from(URL imageUrl) {
return new Img(ImgUtil.read(imageUrl));
}
/**
* 从Image取图片并开始处理
*
* @param image 图片
* @return {@link Img}
*/
public static Img from(Image image) {
return new Img(ImgUtil.toBufferedImage(image));
}
/**
* 构造
*
* @param srcImage 来源图片
*/
public Img(BufferedImage srcImage) {
this(srcImage, null);
}
/**
* 构造
*
* @param srcImage 来源图片
* @param targetImageType 目标图片类型
* @since 5.0.7
*/
public Img(BufferedImage srcImage, String targetImageType) {
this.srcImage = srcImage;
if (null == targetImageType) {
targetImageType = ImgUtil.IMAGE_TYPE_JPG;
}
this.targetImageType = targetImageType;
}
/**
* 设置目标图片文件格式,用于写出
*
* @param imgType 图片格式
* @return this
* @see ImgUtil#IMAGE_TYPE_JPG
* @see ImgUtil#IMAGE_TYPE_PNG
*/
public Img setTargetImageType(String imgType) {
this.targetImageType = imgType;
return this;
}
/**
* 计算x,y坐标的时候是否从中心做为原始坐标开始计算
*
* @param positionBaseCentre 是否从中心做为原始坐标开始计算
* @return this
* @since 4.1.15
*/
public Img setPositionBaseCentre(boolean positionBaseCentre) {
this.positionBaseCentre = positionBaseCentre;
return this;
}
/**
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
*
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
* @return this
* @since 4.3.2
*/
public Img setQuality(double quality) {
return setQuality((float) quality);
}
/**
* 设置图片输出质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
*
* @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩
* @return this
* @since 4.3.2
*/
public Img setQuality(float quality) {
if (quality > 0 && quality < 1) {
this.quality = quality;
} else {
this.quality = 1;
}
return this;
}
/**
* 缩放图像(按比例缩放)
*
* @param scale 缩放比例。比例大于1时为放大,小于1大于0为缩小
* @return this
*/
public Img scale(float scale) {
if (scale < 0) {
// 自动修正负数
scale = -scale;
}
final Image srcImg = getValidSrcImg();
// PNG图片特殊处理
if (ImgUtil.IMAGE_TYPE_PNG.equals(this.targetImageType)) {
final AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(scale, scale), null);
this.targetImage = op.filter(ImgUtil.toBufferedImage(srcImg), null);
} else {
final String scaleStr = Float.toString(scale);
// 缩放后的图片宽
int width = NumberUtil.mul(Integer.toString(srcImg.getWidth(null)), scaleStr).intValue();
// 缩放后的图片高
int height = NumberUtil.mul(Integer.toString(srcImg.getHeight(null)), scaleStr).intValue();
scale(width, height);
}
return this;
}
/**
* 缩放图像(按长宽缩放)<br>
* 注意:目标长宽与原图不成比例会变形
*
* @param width 目标宽度
* @param height 目标高度
* @return this
*/
public Img scale(int width, int height) {
final Image srcImg = getValidSrcImg();
int srcHeight = srcImg.getHeight(null);
int srcWidth = srcImg.getWidth(null);
int scaleType;
if (srcHeight == height && srcWidth == width) {
// 源与目标长宽一致返回原图
this.targetImage = srcImg;
return this;
} else if (srcHeight < height || srcWidth < width) {
// 放大图片使用平滑模式
scaleType = Image.SCALE_SMOOTH;
} else {
scaleType = Image.SCALE_DEFAULT;
}
double sx = NumberUtil.div(width, srcWidth);
double sy = NumberUtil.div(height, srcHeight);
if (ImgUtil.IMAGE_TYPE_PNG.equals(this.targetImageType)) {
没有合适的资源?快使用搜索试试~ 我知道了~
基于SpringBoot + Shiro + MyBatisPlus的权限管理框架.zip
共946个文件
js:374个
java:222个
png:106个
0 下载量 181 浏览量
2024-08-26
13:11:32
上传
评论
收藏 9.97MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无VIP,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的酬劳 3. 积分资源不提供使用问题指导/解答
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot + Shiro + MyBatisPlus的权限管理框架.zip (946个子文件)
mvnw.cmd 6KB
bootstrap.css 143KB
style.css 122KB
bootstrap.min.css 119KB
bootstrap.min.css 118KB
AdminLTE.min.css 88KB
animate.css 64KB
all-skins.min.css 40KB
font-awesome.css 37KB
font-awesome.min.css 32KB
bootstrap-theme.css 26KB
bootstrap-table-group-by.css 24KB
bootstrap-theme.min.css 23KB
_all.css 20KB
_all.css 14KB
layer.css 14KB
_all.css 14KB
_all.css 12KB
bootstrap-datetimepicker.css 12KB
bootstrap-datetimepicker.min.css 11KB
style.css 10KB
fileinput.css 9KB
awesome.css 8KB
fileinput.min.css 7KB
bootstrap-table.css 7KB
style-simple-follow.css 7KB
metroStyle.css 6KB
bootstrap-switch.css 6KB
zTreeStyle.css 6KB
bootstrap-table.min.css 6KB
bootstrap-switch.min.css 5KB
layer.css 5KB
main.css 4KB
metisMenu.css 3KB
theme.css 3KB
style.css 3KB
metisMenu.min.css 3KB
purple.css 2KB
yellow.css 2KB
demo.css 2KB
orange.css 2KB
green.css 2KB
blue.css 2KB
pink.css 2KB
grey.css 2KB
aero.css 2KB
red.css 2KB
line.css 2KB
prism.css 2KB
all.css 2KB
purple.css 2KB
orange.css 2KB
yellow.css 2KB
purple.css 2KB
yellow.css 2KB
orange.css 2KB
green.css 2KB
green.css 1KB
pink.css 1KB
blue.css 1KB
grey.css 1KB
aero.css 1KB
grey.css 1KB
blue.css 1KB
pink.css 1KB
aero.css 1KB
red.css 1KB
red.css 1KB
minimal.css 1KB
polaris.css 1KB
nprogress.css 1KB
square.css 1KB
orange.css 1KB
purple.css 1KB
yellow.css 1KB
green.css 1KB
pink.css 1KB
blue.css 1KB
grey.css 1KB
aero.css 1KB
futurico.css 1KB
red.css 1KB
flat.css 1KB
main.css 1KB
tipsy.css 1KB
gotop.css 1012B
treeTable.css 965B
treeTable.min.css 917B
bootstrap-table-reorder-rows.css 819B
bootstrapValidator.css 700B
treeTable.css 697B
bootstrapValidator.min.css 694B
treeTable.min.css 669B
bootstrap-table-tree-column.css 582B
ie8.css 551B
bootstrap-table-sticky-header.css 416B
bootstrap-table-multiple-selection-row.css 306B
bootstrap-table-click-edit-row.css 287B
bootstrap-table-filter-control.css 190B
bootstrap-table-group-by.css 129B
共 946 条
- 1
- 2
- 3
- 4
- 5
- 6
- 10
资源评论
热爱技术。
- 粉丝: 2484
- 资源: 7862
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功