查看: 33|回复: 0

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

    [复制链接]

    394

    主题

    403

    帖子

    953

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    953
    发表于 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

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    免责声明:
    1、转载或引用本网站内容须注明原网址,并标明本网站网址“源码资源网”
    2、转载或引用本网站中的署名文章,请按规定向原作者支付稿酬
    3、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任
    4、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利
    5、资源部分来自网络,不保证资源的完整性,仅供学习研究,如需运营请购买正版,如有侵权请联系客服删除
    6、本站所有资源不带技术支持,下载资源请24小时内删除,如用于违法用途,或者商业用途,一律用于者承担

    QQ|手机版|小黑屋|依星源码资源网-分享编程干货的网站 ( 鲁ICP备2021043233号-3 )

    GMT+8, 2023-12-12 00:22

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

    © Powered by Net188.com X3.4

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