@Override
public OutputStream watermark1(String ossURL, String logoOsskey, HttpServletResponse response) {
lock.lock();
OutputStream os = null;
InputStream imageStream=null;
//水印
String logoPath = ossService.getOssURL(logoOsskey,bucket);
//原图ossURL
try {
os=response.getOutputStream();
imageStream = getImageStream(ossURL);
Image image2 = ImageIO.read(imageStream);
//获取原图信息
int width = image2.getWidth(null);
int height = image2.getHeight(null);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image2, 0, 0, width, height, null);
// //设置多个图片水印
InputStream logo = getImageStream(logoPath);
Image imageLogo = ImageIO.read(logo);
int logoWidth = imageLogo.getWidth(null);
int logoHeight = imageLogo.getHeight(null);
//设置透明度,ALPHA为接口中自定义的值透明度 0.3F
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
//完成图片旋转30
g.rotate(Math.toRadians(0), bufferedImage.getWidth() / 2, bufferedImage.getHeight() / 2);
int x = -width / 2;
int y = -height / 2;
while (x < width * 1.5) {
y = -height / 2;
while (y < height * 1.5) {
g.drawImage(imageLogo, x, y, null);
y += logoHeight + 200;
}
x += logoHeight + 300;
}
g.dispose();
Thumbnails.Builder thumbnail = Thumbnails.of(bufferedImage);
thumbnail.size(x,y);
ImageIO.write(thumbnail.asBufferedImage(),"png",os);
//JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os);
//en.encode(bufferedImage);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(imageStream!=null){
try {
imageStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
lock.unlock();
return os;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?