Java改变图片的大小

时间:2024-03-03 12:47:59

前面在做项目的时候,有一个需求是需要上传图片的,然而该图片只是简单的展示一些信息,不需要很大,所以在上传图片的时候改变图片的大小就显得很有必要了!然后就写了下面这个方法来改变图片的大小!

 

 

Java代码  收藏代码
  1. /** 
  2.  * 改变图片的大小到宽为size,然后高随着宽等比例变化 
  3.  * @param is 上传的图片的输入流 
  4.  * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream 
  5.  * @param size 新图片的宽 
  6.  * @param format 新图片的格式 
  7.  * @throws IOException 
  8.  */  
  9. public static void resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException {  
  10.     BufferedImage prevImage = ImageIO.read(is);  
  11.     double width = prevImage.getWidth();  
  12.     double height = prevImage.getHeight();  
  13.     double percent = size/width;  
  14.     int newWidth = (int)(width * percent);  
  15.     int newHeight = (int)(height * percent);  
  16.     BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR);  
  17.     Graphics graphics = image.createGraphics();  
  18.     graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null);  
  19.     ImageIO.write(image, format, os);  
  20.     os.flush();  
  21.     is.close();  
  22.     os.close();  
  23. }  
7 
1 
分享到:  
评论
4 楼 coolhappiness 2013-12-26  
非常感谢!
3 楼 234390216 2011-10-10  
wubaodong 写道
问下,这个能处理 CMYK模式的图片吗?我之前也搞过类似的东西,不过还没有解决CMYK模式的图片。

没试过这个
2 楼 wubaodong 2011-10-10  
借地发下我自己的,简单对比了下,核心用到的东西一样。

Java代码  收藏代码
  1. package graphicsTest;  
  2.   
  3. import java.awt.Image;  
  4. import java.awt.image.BufferedImage;  
  5. import java.io.File;  
  6. import java.io.FileOutputStream;  
  7.   
  8. import javax.imageio.ImageIO;  
  9.   
  10. import com.sun.image.codec.jpeg.JPEGCodec;  
  11. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  12.   
  13. public class GraphicsTest1 {  
  14.   
  15.     // 图片宽和高的最大尺寸  
  16.     public static final int IMAGEMAXBIG = 2000;  
  17.     // 图片宽和高的最小尺寸  
  18.     public static final int IMAGEMINBIG = 10;  
  19.     // 按原图大小生成新图  
  20.     public static final int CREATENEWIMAGETYPE_0 = 0;  
  21.     // 按指定的大小生成新图  
  22.     public static final int CREATENEWIMAGETYPE_1 = 1;  
  23.     // 按原图宽高比例生成新图-按指定的宽度  
  24.     public static final int CREATENEWIMAGETYPE_2 = 2;  
  25.     // 按原图宽高比例生成新图-按指定的高度  
  26.     public static final int CREATENEWIMAGETYPE_3 = 3;  
  27.     // 按原图宽高比例生成新图-按指定的宽和高中较大的尺寸  
  28.     public static final int CREATENEWIMAGETYPE_4 = 4;  
  29.     // 按原图宽高比例生成新图-按指定的宽和高中较小的尺寸  
  30.     public static final int CREATENEWIMAGETYPE_5 = 5;  
  31.   
  32.     /** 
  33.      *  
  34.      * @param _file 
  35.      *            原图片 
  36.      * @param createType 
  37.      *            处理类型 
  38.      * @param newW 
  39.      *            新宽度 
  40.      * @param newH 
  41.      *            新高度 
  42.      * @return 
  43.      * @throws Exception 
  44.      */  
  45.     public static String createNewImage(File _file, int createType, int newW,  
  46.             int newH) throws Exception {  
  47.         if (_file == null)  
  48.             return null;  
  49.         String fileName = _file.getPath();  
  50.         if (fileName == null || "".equals(fileName)  
  51.                 || fileName.lastIndexOf(".") == -1)  
  52.             return null;  
  53.         String newFileName = "_NEW";  
  54.         /* 
  55.          * else newFileName = "_" + newFileName; 
  56.          */  
  57.   
  58.         String outFileName = fileName.substring(0, fileName.lastIndexOf("."))  
  59.                 + newFileName  
  60.                 + fileName.substring(fileName.lastIndexOf("."), fileName  
  61.                         .length());  
  62.         String fileExtName = fileName.substring(  
  63.                 (fileName.lastIndexOf(".") + 1), fileName.length());  
  64.         if (newW < IMAGEMINBIG)  
  65.             newW = IMAGEMINBIG;  
  66.         else if (newW > IMAGEMAXBIG)  
  67.             newW = IMAGEMAXBIG;  
  68.   
  69.         if (newH < IMAGEMINBIG)  
  70.             newH = IMAGEMINBIG;  
  71.         else if (newH > IMAGEMAXBIG)  
  72.             newH = IMAGEMAXBIG;  
  73.   
  74.         // 得到原图信息  
  75.         if (!_file.exists() || !_file.isAbsolute() || !_file.isFile()  
  76.                 || !checkImageFile(fileExtName))  
  77.             return null;  
  78.         if ((new File(outFileName)).exists()) {  
  79.             System.out.println("file [" + outFileName + "] already exists");  
  80.             throw new Exception();  
  81.         }  
  82.         Image src = ImageIO.read(_file);  
  83.         int w = src.getWidth(null);  
  84.         int h = src.getHeight(null);  
  85.   
  86.         // 确定目标图片的大小  
  87.         int nw = w;  
  88.         int nh = h;  
  89.         if (createType == CREATENEWIMAGETYPE_0)  
  90.             ;  
  91.         else if (createType == CREATENEWIMAGETYPE_1) {  
  92.             nw = newW;  
  93.             nh = newH;  
  94.         } else if (createType == CREATENEWIMAGETYPE_2) {  
  95.             nw = newW;  
  96.             nh = (int) ((double) h / (double) w * nw);  
  97.         } else if (createType == CREATENEWIMAGETYPE_3) {  
  98.             nh = newH;  
  99.             nw = (int) ((double) w / (double) h * nh);  
  100.         } else if (createType == CREATENEWIMAGETYPE_4) {  
  101.             if ((double) w / (double) h >= (double) newW / (double) newH) {  
  102.                 nh = newH;  
  103.                 nw = (int) ((double) w / (double) h * nh);  
  104.             } else {  
  105.                 nw = newW;  
  106.                 nh = (int) ((double) h / (double) w * nw);  
  107.             }  
  108.         } else if (createType == CREATENEWIMAGETYPE_5) {  
  109.             if ((double) w / (double) h <= (double) newW / (double) newH) {  
  110.                 nh = newH;  
  111.                 nw = (int) ((double) w / (double) h * nh);  
  112.             } else {  
  113.                 nw = newW;  
  114.                 nh = (int) ((double) h / (double) w * nw);  
  115.             }  
  116.         }  
  117.   
  118.         // 构造目标图片  
  119.         BufferedImage tag = new BufferedImage(nw, nh,  
  120.                 BufferedImage.TYPE_INT_RGB);  
  121.   
  122.         // 得到目标图片输出流  
  123.         FileOutputStream out = new FileOutputStream(outFileName);  
  124.   
  125.         // 根据需求画出目标图片 方式1  
  126.         tag.getGraphics().drawImage(src, 0, 0, nw, nh, null);  
  127.   
  128.         // 将画好的目标图输出到输出流 方式1  
  129.         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
  130.         encoder.encode(tag);  
  131.         out.close();  
  132.         return outFileName;  
  133.     }  
  134.   
  135.     public static boolean checkImageFile(String extName) {  
  136.   
  137.         if ("jpg".equalsIgnoreCase(extName))  
  138.             return true;  
  139.         if ("gif".equalsIgnoreCase(extName))  
  140.             return true;  
  141.         if ("bmp".equalsIgnoreCase(extName))  
  142.             return true;  
  143.         if ("jpeg".equalsIgnoreCase(extName))  
  144.             return true;  
  145.         if ("png".equalsIgnoreCase(extName))  
  146.             return true;  
  147.         return false;  
  148.     }  
  149.   
  150. }  


1 楼 wubaodong 2011-10-10  
问下,这个能处理 CMYK模式的图片吗?我之前也搞过类似的东西,不过还没有解决CMYK模式的图片。