依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 169|回复: 0

JAVA生成图片缩略图、JAVA截取图片局部内容

[复制链接] 主动推送

5450

主题

5497

帖子

6878

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
6878
发表于 2023-11-17 11:00:45 | 显示全部楼层 |阅读模式
JAVA生成图片缩略图、JAVA截取图片局部内容
目前,google已经有了更好的处理JAVA图片的工具,请搜索:Thumbnailator

  1. package com.ares.image.test;

  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.IOException;
  8. import java.util.Arrays;

  9. import javax.imageio.ImageIO;

  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;

  12. import com.ares.slf4j.test.Slf4jUtil;

  13. /**
  14. * <p>Title: ImageUtil </p>
  15. * <p>Description: 使用JDK原生态类生成图片缩略图和裁剪图片 </p>
  16. * <p>Email: icerainsoft@hotmail.com </p>
  17. * @author Ares
  18. * @date 2014年10月28日 上午10:24:26
  19. */
  20. public class ImageUtil {

  21.     static {
  22.         Slf4jUtil.buildSlf4jUtil().loadSlf4j();
  23.     }
  24.     private Logger log = LoggerFactory.getLogger(getClass());
  25.    
  26.     private static String DEFAULT_PREVFIX = "thumb_";
  27.     private static Boolean DEFAULT_FORCE = false;
  28.    
  29.     /**
  30.      * <p>Title: thumbnailImage</p>
  31.      * <p>Description: 根据图片路径生成缩略图 </p>
  32.      * @param imagePath    原图片路径
  33.      * @param w            缩略图宽
  34.      * @param h            缩略图高
  35.      * @param prevfix    生成缩略图的前缀
  36.      * @param force        是否强制按照宽高生成缩略图(如果为false,则生成最佳比例缩略图)
  37.      */
  38.     public void thumbnailImage(File imgFile, int w, int h, String prevfix, boolean force){
  39.         if(imgFile.exists()){
  40.             try {
  41.                 // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
  42.                 String types = Arrays.toString(ImageIO.getReaderFormatNames());
  43.                 String suffix = null;
  44.                 // 获取图片后缀
  45.                 if(imgFile.getName().indexOf(".") > -1) {
  46.                     suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
  47.                 }// 类型和图片后缀全部小写,然后判断后缀是否合法
  48.                 if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){
  49.                     log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
  50.                     return ;
  51.                 }
  52.                 log.debug("target image's size, width:{}, height:{}.",w,h);
  53.                 Image img = ImageIO.read(imgFile);
  54.                 if(!force){
  55.                     // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
  56.                     int width = img.getWidth(null);
  57.                     int height = img.getHeight(null);
  58.                     if((width*1.0)/w < (height*1.0)/h){
  59.                         if(width > w){
  60.                             h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));
  61.                             log.debug("change image's height, width:{}, height:{}.",w,h);
  62.                         }
  63.                     } else {
  64.                         if(height > h){
  65.                             w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));
  66.                             log.debug("change image's width, width:{}, height:{}.",w,h);
  67.                         }
  68.                     }
  69.                 }
  70.                 BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  71.                 Graphics g = bi.getGraphics();
  72.                 g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
  73.                 g.dispose();
  74.                 String p = imgFile.getPath();
  75.                 // 将图片保存在原目录并加上前缀
  76.                 ImageIO.write(bi, suffix, new File(p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName()));
  77.             } catch (IOException e) {
  78.                log.error("generate thumbnail image failed.",e);
  79.             }
  80.         }else{
  81.             log.warn("the image is not exist.");
  82.         }
  83.     }
  84.    
  85.     public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){
  86.         File imgFile = new File(imagePath);
  87.         thumbnailImage(imgFile, w, h, prevfix, force);
  88.     }
  89.    
  90.     public void thumbnailImage(String imagePath, int w, int h, boolean force){
  91.         thumbnailImage(imagePath, w, h, DEFAULT_PREVFIX, force);
  92.     }
  93.    
  94.     public void thumbnailImage(String imagePath, int w, int h){
  95.         thumbnailImage(imagePath, w, h, DEFAULT_FORCE);
  96.     }
  97.    
  98.     public static void main(String[] args) {
  99.         new ImageUtil().thumbnailImage("imgs/Tulips.jpg", 100, 150);
  100.     }

  101. }
复制代码
效果:(原图是电脑"图片"文件夹下的郁金香图片,大小1024*768,生成的图片为200*150大小,保持4:3的比例)
0001.jpg

JAVA 截取图片局部内容:

  1. package com.ares.image.test;

  2. import java.awt.Color;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.FileNotFoundException;
  9. import java.io.IOException;
  10. import java.io.OutputStream;
  11. import java.util.Arrays;

  12. import javax.imageio.ImageIO;
  13. import javax.imageio.ImageReadParam;
  14. import javax.imageio.ImageReader;
  15. import javax.imageio.stream.ImageInputStream;

  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;

  18. import com.ares.slf4j.test.Slf4jUtil;

  19. /**
  20. * <p>Title: ImageUtil </p>
  21. * <p>Description: </p>
  22. * <p>Email: icerainsoft@hotmail.com </p>
  23. * @author Ares
  24. * @date 2014年10月28日 上午10:24:26
  25. */
  26. public class ImageUtil {

  27.     static {
  28.         Slf4jUtil.buildSlf4jUtil().loadSlf4j();
  29.     }
  30.     private Logger log = LoggerFactory.getLogger(getClass());
  31.    
  32.     private static String DEFAULT_THUMB_PREVFIX = "thumb_";
  33.     private static String DEFAULT_CUT_PREVFIX = "cut_";
  34.     private static Boolean DEFAULT_FORCE = false;
  35.    
  36.    
  37.     /**
  38.      * <p>Title: cutImage</p>
  39.      * <p>Description:  根据原图与裁切size截取局部图片</p>
  40.      * @param srcImg    源图片
  41.      * @param output    图片输出流
  42.      * @param rect        需要截取部分的坐标和大小
  43.      */
  44.     public void cutImage(File srcImg, OutputStream output, java.awt.Rectangle rect){
  45.         if(srcImg.exists()){
  46.             java.io.FileInputStream fis = null;
  47.             ImageInputStream iis = null;
  48.             try {
  49.                 fis = new FileInputStream(srcImg);
  50.                 // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
  51.                 String types = Arrays.toString(ImageIO.getReaderFormatNames()).replace("]", ",");
  52.                 String suffix = null;
  53.                 // 获取图片后缀
  54.                 if(srcImg.getName().indexOf(".") > -1) {
  55.                     suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
  56.                 }// 类型和图片后缀全部小写,然后判断后缀是否合法
  57.                 if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()+",") < 0){
  58.                     log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
  59.                     return ;
  60.                 }
  61.                 // 将FileInputStream 转换为ImageInputStream
  62.                 iis = ImageIO.createImageInputStream(fis);
  63.                 // 根据图片类型获取该种类型的ImageReader
  64.                 ImageReader reader = ImageIO.getImageReadersBySuffix(suffix).next();
  65.                 reader.setInput(iis,true);
  66.                 ImageReadParam param = reader.getDefaultReadParam();
  67.                 param.setSourceRegion(rect);
  68.                 BufferedImage bi = reader.read(0, param);
  69.                 ImageIO.write(bi, suffix, output);
  70.             } catch (FileNotFoundException e) {
  71.                 e.printStackTrace();
  72.             } catch (IOException e) {
  73.                 e.printStackTrace();
  74.             } finally {
  75.                 try {
  76.                     if(fis != null) fis.close();
  77.                     if(iis != null) iis.close();
  78.                 } catch (IOException e) {
  79.                     e.printStackTrace();
  80.                 }
  81.             }
  82.         }else {
  83.             log.warn("the src image is not exist.");
  84.         }
  85.     }
  86.    
  87.     public void cutImage(File srcImg, OutputStream output, int x, int y, int width, int height){
  88.         cutImage(srcImg, output, new java.awt.Rectangle(x, y, width, height));
  89.     }
  90.    
  91.     public void cutImage(File srcImg, String destImgPath, java.awt.Rectangle rect){
  92.         File destImg = new File(destImgPath);
  93.         if(destImg.exists()){
  94.             String p = destImg.getPath();
  95.             try {
  96.                 if(!destImg.isDirectory()) p = destImg.getParent();
  97.                 if(!p.endsWith(File.separator)) p = p + File.separator;
  98.                 cutImage(srcImg, new java.io.FileOutputStream(p + DEFAULT_CUT_PREVFIX + "_" + new java.util.Date().getTime() + "_" + srcImg.getName()), rect);
  99.             } catch (FileNotFoundException e) {
  100.                 log.warn("the dest image is not exist.");
  101.             }
  102.         }else log.warn("the dest image folder is not exist.");
  103.     }
  104.    
  105.     public void cutImage(File srcImg, String destImg, int x, int y, int width, int height){
  106.         cutImage(srcImg, destImg, new java.awt.Rectangle(x, y, width, height));
  107.     }
  108.    
  109.     public void cutImage(String srcImg, String destImg, int x, int y, int width, int height){
  110.         cutImage(new File(srcImg), destImg, new java.awt.Rectangle(x, y, width, height));
  111.     }
  112.     /**
  113.      * <p>Title: thumbnailImage</p>
  114.      * <p>Description: 根据图片路径生成缩略图 </p>
  115.      * @param imagePath    原图片路径
  116.      * @param w            缩略图宽
  117.      * @param h            缩略图高
  118.      * @param prevfix    生成缩略图的前缀
  119.      * @param force        是否强制按照宽高生成缩略图(如果为false,则生成最佳比例缩略图)
  120.      */
  121.     public void thumbnailImage(File srcImg, OutputStream output, int w, int h, String prevfix, boolean force){
  122.         if(srcImg.exists()){
  123.             try {
  124.                 // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
  125.                 String types = Arrays.toString(ImageIO.getReaderFormatNames()).replace("]", ",");
  126.                 String suffix = null;
  127.                 // 获取图片后缀
  128.                 if(srcImg.getName().indexOf(".") > -1) {
  129.                     suffix = srcImg.getName().substring(srcImg.getName().lastIndexOf(".") + 1);
  130.                 }// 类型和图片后缀全部小写,然后判断后缀是否合法
  131.                 if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()+",") < 0){
  132.                     log.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
  133.                     return ;
  134.                 }
  135.                 log.debug("target image's size, width:{}, height:{}.",w,h);
  136.                 Image img = ImageIO.read(srcImg);
  137.                 // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
  138.                 if(!force){
  139.                     int width = img.getWidth(null);
  140.                     int height = img.getHeight(null);
  141.                     if((width*1.0)/w < (height*1.0)/h){
  142.                         if(width > w){
  143.                             h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));
  144.                             log.debug("change image's height, width:{}, height:{}.",w,h);
  145.                         }
  146.                     } else {
  147.                         if(height > h){
  148.                             w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));
  149.                             log.debug("change image's width, width:{}, height:{}.",w,h);
  150.                         }
  151.                     }
  152.                 }
  153.                 BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  154.                 Graphics g = bi.getGraphics();
  155.                 g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
  156.                 g.dispose();
  157.                 // 将图片保存在原目录并加上前缀
  158.                 ImageIO.write(bi, suffix, output);
  159.                 output.close();
  160.             } catch (IOException e) {
  161.                log.error("generate thumbnail image failed.",e);
  162.             }
  163.         }else{
  164.             log.warn("the src image is not exist.");
  165.         }
  166.     }
  167.     public void thumbnailImage(File srcImg, int w, int h, String prevfix, boolean force){
  168.         String p = srcImg.getAbsolutePath();
  169.         try {
  170.             if(!srcImg.isDirectory()) p = srcImg.getParent();
  171.             if(!p.endsWith(File.separator)) p = p + File.separator;
  172.             thumbnailImage(srcImg, new java.io.FileOutputStream(p + prevfix +srcImg.getName()), w, h, prevfix, force);
  173.         } catch (FileNotFoundException e) {
  174.             log.error("the dest image is not exist.",e);
  175.         }
  176.     }
  177.    
  178.     public void thumbnailImage(String imagePath, int w, int h, String prevfix, boolean force){
  179.         File srcImg = new File(imagePath);
  180.         thumbnailImage(srcImg, w, h, prevfix, force);
  181.     }
  182.    
  183.     public void thumbnailImage(String imagePath, int w, int h, boolean force){
  184.         thumbnailImage(imagePath, w, h, DEFAULT_THUMB_PREVFIX, DEFAULT_FORCE);
  185.     }
  186.    
  187.     public void thumbnailImage(String imagePath, int w, int h){
  188.         thumbnailImage(imagePath, w, h, DEFAULT_FORCE);
  189.     }
  190.    
  191.     public static void main(String[] args) {
  192.         new ImageUtil().thumbnailImage("imgs/Tulips.jpg", 150, 100);
  193.         new ImageUtil().cutImage("imgs/Tulips.jpg","imgs", 250, 70, 300, 400);
  194.     }

  195. }
复制代码
效果如下:(使用在上传图片时取缩略图和截图的地方,例如,图像截取并缩略)
0002.jpg

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员5折;永久VIP免费
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|依星源码资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2024-4-28 19:55

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表