摘要:时间年月日星期六说明本文部分内容均来自慕课网。可以更加专注于业务逻辑开发,缩短项目开发周期,提高项目开发速度。
时间:2017年07月15日星期六
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:https://github.com/zccodere/s...
在用户进行信息概略浏览的时候,提供缩略图
提升程序性能 提升程序效率
课程内容
Java图片等比缩略图实现方式介绍 课程项目案例介绍 实现图片等比缩略图的生成1-2 实现方式
实现方式
Thumbnailator类库: 推荐使用 size()API方法 Java AWT类库: 根据缩略比例计算缩略图高度和宽度 使用Image类获得原图的缩放版本 使用ImageIO类保存缩略图 BufferedImage类 ImageIO类 Graphics类第二章:案例介绍 2-1 案例介绍
案例介绍
基于springmvc框架的Java Web应用程序,允许上传图片,并生成图片的缩略图
效果示意图
第三章:案例实现 3-1 框架搭建个人学习时,使用springboot+freemaker+mavem搭建,POM文件如下
4.0.0 com.myimooc thumbnail 0.0.1-SNAPSHOT jar thumbnail http://maven.apache.org org.springframework.boot spring-boot-starter-parent 1.5.1.RELEASE UTF-8 UTF-8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-freemarker commons-io commons-io 2.5 net.coobird thumbnailator 0.4.8 org.apache.maven.plugins maven-compiler-plugin 1.8
项目层级结构如下
3-2 上传页面开发代码演示:
3-3 控制器开发上传文件 图片上传
代码演示:
package com.myimooc.thumbnail.controller; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import com.myimooc.thumbnail.service.ThumbnailService; import com.myimooc.thumbnail.service.UploadService; /** * Thumbnail 控制器类 * @author ZhangCheng on 2017-07-19 * */ @Controller @RequestMapping("/") public class ThumbnailController { private static Logger logger = LoggerFactory.getLogger(ThumbnailController.class); @Autowired private UploadService uploadService; @Autowired private ThumbnailService thumbnailService; @PostMapping("thumbnail") public ModelAndView thumbnail(MultipartFile image,HttpServletRequest request){ ModelAndView mav = new ModelAndView(); String uploadPath = "static/images/"; String realUploadPath = getClass().getClassLoader().getResource(uploadPath).getPath(); logger.info("上传相对目录:{}",uploadPath); logger.info("上传绝对目录:{}",uploadPath); String imageUrl = uploadService.uploadImage(image, uploadPath, realUploadPath); String thumImageUrl = thumbnailService.thumbnail(image, uploadPath, realUploadPath); mav.addObject("imageURL", imageUrl); mav.addObject("thumImageUrl", thumImageUrl); mav.setViewName("thumbnail"); return mav; } }3-4 图片上传服务类开发
代码演示:
package com.myimooc.thumbnail.service; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** * 图片上传服务类 * @author ZhangCheng on 2017-07-19 * */ @Service public class UploadService { private static Logger logger = LoggerFactory.getLogger(UploadService.class); public String uploadImage(MultipartFile file,String uploadPath,String realUploadPath){ logger.info("上传的相对路径:{}",uploadPath); logger.info("上传的绝对路径:{}",realUploadPath); String filePath = realUploadPath + file.getOriginalFilename(); try { File targetFile=new File(filePath); logger.info("将图片写入文件:"+ filePath); FileUtils.writeByteArrayToFile(targetFile, file.getBytes()); } catch (IOException e) { logger.info("图片写入失败"); e.printStackTrace(); } return uploadPath + "/" + file.getOriginalFilename(); } }3-5 缩略图生成服务类开发
代码演示:
package com.myimooc.thumbnail.service; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import net.coobird.thumbnailator.Thumbnails; /** * 缩略图服务类 * @author ZhangCheng on 2017-07-19 * */ @Service public class ThumbnailService { public static final int WIDTH = 100; public static final int HEIGHT = 100; public String thumbnail(MultipartFile file,String uploadPath,String realUploadPath){ try{ String des = realUploadPath + "/thum_" + file.getOriginalFilename(); Thumbnails.of(file.getInputStream()).size(WIDTH, HEIGHT).toFile(des); }catch (Exception e) { e.printStackTrace(); } return uploadPath + "/thum_" + file.getOriginalFilename(); } }3-6 AWT服务类讲解
代码演示:
package com.myimooc.thumbnail.service; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; /** * 缩略图服务类 * * @author ZhangCheng on 2017-07-19 * */ @Service public class ThumbnailAWTService { public static final int WIDTH = 100; public static final int HEIGHT = 100; @SuppressWarnings("static-access") public String thumbnail(MultipartFile file, String uploadPath, String realUploadPath) { OutputStream os = null; try { String des = realUploadPath + "/thum_" + file.getOriginalFilename(); os = new FileOutputStream(des); Image image = ImageIO.read(file.getInputStream()); int width = image.getWidth(null);// 原图狂宽度 int height = image.getHeight(null);// 原图高度 int rateWidth = width / WIDTH;// 宽度缩略比例 int rateHeight = height / HEIGHT;// 高度缩略比 // 宽度缩略比例大于高度缩略比例,使用宽度缩略比例 int rate = rateWidth > rateHeight ? rateWidth : rateHeight; // 计算缩略图最终的宽度和高度 int newWidth = width / rate; int newHeight = height / rate; BufferedImage bufferedImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB); bufferedImage.getGraphics().drawImage(image.getScaledInstance(newWidth, newHeight, image.SCALE_SMOOTH), 0, 0, null); String imageType = file.getContentType().substring(file.getContentType().indexOf("/") + 1); ImageIO.write(bufferedImage, imageType, os); } catch (Exception e) { e.printStackTrace(); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } } return uploadPath + "/thum_" + file.getOriginalFilename(); } }3-7 展示页面开发
代码演示:
处理结果 操作结果
效果演示:
启动项目,访问主页
点击选择图片
点击上传,结果显示如下
第四章:课程总结 4-1 课程总结通过使用开源组件,可以很方便的实现自己需要的功能。可以更加专注于业务逻辑开发,缩短项目开发周期,提高项目开发速度。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67450.html
时间:2017年07月09日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:概述 1-1 课程概述 主要内容 验证码历史 课程内容 不同方案对比 设计与实现 总结 1-2 验证码历史 验证码历史 无验证码:垃圾骚扰 Luis von Ahn:Captcha 不断...
时间:2017年08月27日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/zccodere/s... 第一章:单例模式简介 1-1 简介 单例模式 概念及应用场合 饿汉模式 懒汉模式 饿汉模式与懒汉模式的区别 什么是设计模式 是一套被反...
摘要:时间年月日星期五说明本文部分内容均来自慕课网。线性堆叠式二维码示意图矩阵式二维码在一个矩形空间通过黑白像素在矩阵中的不同分布进行编码。 时间:2017年06月23日星期五说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:无个人学习源码:https://github.com/zccodere/s... 第一章:二维码的概念 1-1 二维码概述...
摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...
摘要:时间年月日星期日说明本文部分内容均来自慕课网。用户可以在服务器端调用云存储云检索从而构建自己的存储和检索服务,甚至可以制作自己的数据管理台。 时间:2017年08月13日星期日说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:无学习源码:https://github.com/zccodere/s... 第一章:云图产品介绍 1-1 云图产品介绍...
阅读 1598·2021-11-22 09:34
阅读 1688·2019-08-29 16:36
阅读 2667·2019-08-29 15:43
阅读 3112·2019-08-29 13:57
阅读 1295·2019-08-28 18:05
阅读 1873·2019-08-26 18:26
阅读 3240·2019-08-26 10:39
阅读 3452·2019-08-23 18:40