package yinwenjie.sample.image.controller;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import yinwenjie.sample.image.configuration.ImagePathProperties;
import yinwenjie.sample.image.exception.BusinessCode;
import yinwenjie.sample.image.exception.BusinessException;
import yinwenjie.sample.image.service.ImageHandler;
import yinwenjie.sample.image.service.ImageHandlerBuilder;
import yinwenjie.sample.image.service.iface.IImageEffectsCacheService;
/**
* 这个测试图片特效显示效果
* @author yinwenjie
*/
@Controller
public class ImageViewController extends BaseController {
/**
* 日志
* */
private static final Log LOGGER = LogFactory.getLog(ImageViewController.class);
/**
* 图片操作相关的配置信息
* */
@Autowired
private ImagePathProperties imagePathProperties;
/**
* 缓存操作服务
*/
@Autowired
private IImageEffectsCacheService imageEffectsCacheService;
/**
* 这个方法测试有参数的图片访问方式<br/>
* 这里留了几个测试参数:<br/>
* ?special=zoomimage%7Cwidth%3D300%7Cheight%3D300->markimage%7CmarkValue%3Dwwwyinwenjienet.222<br/>
* ?special=zoomimage%7Cratio%3D0.1->markimage%7CmarkValue%3Dwww.yinwenjie.net<br/>
* ?special=cutimage%7Cratio%3D0.1->markimage%7CmarkValue%3Dwww.yinwenjie.net<br/>
* ?special=cutimage%7Cwidth%3D300%7Cheight%3D300->markimage%7CmarkValue%3Dwww.yinwenjie.net<br/>
* */
@RequestMapping(path = {"/imageQuery/{folder}/{imageFile}.{prefix}","/imageQuery/{imageFile}.{prefix}"} , method = RequestMethod.GET)
public void imageQuery(HttpServletResponse response , @PathVariable("folder") String folder , @PathVariable("imageFile") String imageFile , @PathVariable("prefix") String prefix , String special) throws Exception {
String imageRoot = imagePathProperties.getImageRoot();
LOGGER.info("image service 8080 accept!");
/*
* 缓存操作 ============
* 1、使用图片相对路径(包括存储目录的)和输入的原始特效参数作为缓存系统的key值
* (虽然有点长,会相对增加一些hash计算时间,但比起去做磁盘操作所耗费的时间来说就太少了)
* 要注意,如果没有特效参数,则直接进行磁盘操作,因为缓存中没有存储原始的图片数据
* 2、试图从缓存中拿到数据,如果拿到则直接返回,如果没有拿到,进行后续的磁盘操作
*
* 磁盘操作 =============
* 1、根据imageRoot和imageFile的信息在文件系统上提取原始信息,如果没有提取到则不再处理
* 2、根据既定的特效命令格式,分析请求者要求的特效情况
* 3、更具这个特效情况,使用特效构造者构造特效
* 4、进行特效处理的结果读取并存储到缓存
* (缓存默认的过期时间为5分钟,当然可以更改配置文件进行调整,建议可以调整的更长些,例如6小时)
* 5、显示到页面上
* */
// 1、========
String relativePath = folder + "/" + imageFile + "." + prefix;
String caheKey = relativePath + special;
if(!StringUtils.isEmpty(special)) {
byte[] results = this.imageEffectsCacheService.queryCache(caheKey);
// 2、======== 如果条件成立,说明从缓存中读到了信息
if(results != null && results.length > 0) {
// 输出到页面,就可以结束了
this.writeResponseGif(response, results);
return;
}
}
// 1、========
File imFile = null;
imFile = new File(imageRoot + "/" + relativePath);
byte[] fileBytes = this.queryOriginalPicture(imFile);
if(fileBytes == null) {
return;
}
// 2、=======
// 如果没有特效要求,就不进行特效处理,直接显示原图了
if(StringUtils.isEmpty(special)) {
this.writeResponseGif(response , fileBytes);
return;
}
BufferedImage bufferedImage = null;
try {
bufferedImage = javax.imageio.ImageIO.read(new ByteArrayInputStream(fileBytes));
} catch (IOException e) {
LOGGER.error(e.getMessage() , e);
}
String[] specialSteps = special.split("\\-\\>");
if(specialSteps.length == 0) {
return;
}
// 3、=======
// 图片处理器创建者
ImageHandlerBuilder.Builder builder = new ImageHandlerBuilder.Builder();
for (String specialStep : specialSteps) {
String[] params = specialStep.split("\\|");
//
if(StringUtils.equals(params[0] , "cutimage")) {
this.builderCutAndZoomImageHandle(params , builder , "cutimage");
} else if(StringUtils.equals(params[0] , "zoomimage")) {
this.builderCutAndZoomImageHandle(params , builder , "zoomimage");
} else if(StringUtils.equals(params[0] , "markimage")) {
this.builderMarkImageHandle(params , builder);
}
}
// 4、=======
ImageHandler imageHandle = builder.build();
BufferedImage imageResults = imageHandle.dispose(bufferedImage);
ByteArrayOutputStream out = new ByteArrayOutputStream();
javax.imageio.ImageIO.write(imageResults , prefix , out);
byte[] imageBytes = out.toByteArray();
// 存储到缓存
this.imageEffectsCacheService.saveCache(caheKey, imageBytes);
// 5、=======显示到页面上
this.writeResponseGif(response , imageBytes);
}
/**
* 这个私有方法用于创建水印图片的特效
* @param params 水印图片的特效参数(实际上只有一个markValue)
* @param builder 特效创建器
* */
private void builderMarkImageHandle(String[] params , ImageHandlerBuilder.Builder builder) throws BusinessException {
String markValue = null;
for(String param : params) {
String[] paramVars = param.split("=");
if(StringUtils.equals(paramVars[0] , "markValue")) {
markValue = paramVars[1];
}
}
// 对参数的正确选定进行判断
if(StringUtils.isEmpty(markValue)) {
throw new BusinessException("markValue must be set value!" , BusinessCode._404);
}
// 设定到创建器
builder.createMarkHandler(markValue);
}
/**
* 这个私有方法用于创建裁剪图片/缩放图片的特效
* @param params 裁剪图片/缩放图片的特效参数
* @param builder 特效创建器
* */
private void builderCutAndZoomImageHandle(String[] params , ImageHandlerBuilder.Builder builder , String opType) throws BusinessException {
Integer width = null,height = null;
Float ratio = null;
for(String param : params) {
String[] paramVars = param.split("=");
if(StringUtils.equals(paramVars[0] , "width")) {
width = Integer.parseInt(paramVars[1]);
} else if(StringUtils.equals(paramVars[0] , "height")) {
height = Integer.parseInt(paramVars[1]);
} else if(StringUtils.equals(paramVars[0] , "ratio")) {
ratio = Float.parseFloat(paramVars[1]);
}
}
// 对参数的正确选定进行判断
if(ratio != null && (ratio <= 0f || ratio >= 1f)) {
throw new BusinessException("ratio must between from 0 to 1!" , BusinessCode._404);
} else if(ratio == null && (width == null || height == null)) {
throw new BusinessException("width and height must be set value!" , BusinessCode._404);
}
// 设定到创建器
if(ratio != null && StringUtils.equals(opType , "cutimage")) {
builder.createCutHandler(ratio);
} else if(ratio != null && StringUtils.equals(opType , "zoomimage")) {
builder.createZoomHandler(ratio);
} else if(ratio == null && StringUtils.equals(opType , "cutimage")) {
builder.crea
图片服务系统工程代码



《图片服务系统工程代码解析》 在现代互联网应用中,图片服务系统扮演着至关重要的角色。它负责存储、处理和分发大量的图片资源,确保用户能够快速、稳定地浏览和获取图片信息。本文将深入探讨一个名为“ImageProject”的图片服务系统工程代码,通过分析其结构、功能和实现原理,来揭示图片服务系统的内在运作机制。 我们来理解一下“图片服务系统”。这是一种专门设计用于处理图像数据的后端系统,主要功能包括图片上传、存储、格式转换、缩略图生成、图片处理(如滤镜效果)、防盗链保护以及CDN分发等。这样的系统通常需要具有高并发处理能力,以及良好的扩展性和稳定性。 ImageProject作为这样一个图片服务系统的核心代码库,我们可以从以下几个方面去剖析它的功能和设计思路: 1. **文件组织结构**:代码的组织方式往往反映了系统的模块化设计。ImageProject可能包含多个子目录,分别对应不同的功能模块,如图片上传模块、存储模块、处理模块等。每个模块内部则按照业务逻辑和功能划分,便于代码维护和扩展。 2. **图片上传与存储**:图片上传是图片服务的基础功能,ImageProject可能实现了上传接口,支持用户或应用程序上传图片到服务器。存储部分可能涉及数据库和文件系统的交互,以确保图片的安全存储和高效检索。 3. **图片处理**:ImageProject可能会包含一系列图片处理算法,如图片的缩放、裁剪、旋转、水印添加等。这些处理通常由专门的图片处理库完成,例如OpenCV或PIL等,以满足不同场景下的需求。 4. **CDN集成**:为了提高图片加载速度,减少服务器压力,ImageProject可能会整合CDN(Content Delivery Network)服务,将图片分发到全球各地的边缘节点,使用户可以从最近的节点获取图片,提升用户体验。 5. **安全机制**:为了防止图片被盗用,ImageProject可能有防盗链措施,例如检查HTTP请求头中的Referer字段,只允许来自特定源的请求访问图片。此外,可能还会有鉴权系统,对敏感操作(如删除图片)进行权限控制。 6. **性能优化**:对于处理大量图片的系统,性能优化至关重要。ImageProject可能采用了缓存策略,如内存缓存、数据库缓存等,减少不必要的IO操作。同时,也可能进行了数据库索引优化、异步处理等技术手段,以提高系统响应速度。 7. **监控与日志**:为了保证系统稳定运行,ImageProject会包含日志记录和监控系统,以便追踪错误、分析性能瓶颈,并及时发现和解决问题。 通过阅读和学习ImageProject的源代码,开发者可以深入了解图片服务系统的架构设计,掌握图片处理、存储、分发的关键技术和最佳实践。同时,结合作者的博客文章(http://blog.csdn.net/yinwenjie/article/details/54016015),可以获得更深入的理论指导和实践经验,对于提升自身在这一领域的专业技能大有裨益。






























































































































- 1
- 2
- 3

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- lmsother2017-11-28是我需要的资源,不错
- cereusxing2019-04-22是我需要的资源,不错

- 粉丝: 1w+
- 资源: 8
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 18考试真题最近的t17.txt
- 18考试真题最近的t18.txt
- 18考试真题最近的t19.txt
- 18考试真题最近的t20.txt
- 18考试真题最近的t21.txt
- 台达PLC与传感器RS485通讯:MODBUS-RTU协议的实际应用验证与效果分析,台达PLC与传感器通过RS485实现MODBUS-RTU通讯的实战应用与效果验证,台达PLC和传感器RS485通讯M
- 18考试真题最近的t22.txt
- 18考试真题最近的t23.txt
- 18考试真题最近的t24.txt
- 18考试真题最近的t25.txt
- STM32F1升级方案:Ymodem协议串口通信,包含Bootloader和上位机源码,Keil工程及详细使用说明,STM32F1升级方案:Ymodem协议串口通信,包含Bootloader和上位机源
- 18考试真题最近的t26.txt
- DeepSeek-V3源代码100%好用.zip
- Carsim与Simulink联合仿真实现PID轨迹跟踪控制:八字轨迹解析及高速应用,适用于Carsim2019与Matlab2018教学视频,Carsim与Simulink联合仿真实现PID轨迹跟踪
- 行李寄存管理系统的设计与实现(源码)-kaic.zip
- CEFSharp 115,已开启H264、H265硬件解码,测试好用,已用在工程中 仅64位 直接替换原来的文件即可


