java改变图片文件尺寸
方式一:缩放图片(缺点:如果需要固定尺寸图片,那么会使得原图变形)
1.单个图片尺寸处理:
package test.common; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.imageio.ImageIO; public class ImgTest { private Image img; private final static int WIDTH = 147; private final static int HEIGHT = 136; /** * 改变图片的大小到宽为size,然后高随着宽等比例变化 * @param is 上传的图片的输入流 * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream * @param size 新图片的宽 * @param format 新图片的格式 * @throws IOException */ public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException { BufferedImage prevImage = ImageIO.read(is); double width = prevImage.getWidth(); double height = prevImage.getHeight(); double percent = size/width; int newWidth = (int)(width * percent); int newHeight = (int)(height * percent); BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR); Graphics graphics = image.createGraphics(); graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null); ImageIO.write(image, format, os); os.flush(); is.close(); os.close(); ByteArrayOutputStream b = (ByteArrayOutputStream) os; return os; } public static void main(String[] args) { try { InputStream is = new FileInputStream(new File("download/qrcode_test.jpg")); OutputStream os = new FileOutputStream(new File("download/qrcode_test_1.jpg")); resizeImage(is, os, 10, "png"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.批量图片尺寸处理:
package com.test; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedHashMap; import javax.imageio.ImageIO; public class ImgChange { private Image img; private final static int WIDTH = 147; private final static int HEIGHT = 136; /** * 改变图片的大小到宽为size,然后高随着宽等比例变化 * @param is 上传的图片的输入流 * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream * @param size 新图片的宽 * @param format 新图片的格式 * @throws IOException */ public static OutputStream resizeImage(InputStream is, OutputStream os, int size, String format) throws IOException { BufferedImage prevImage = ImageIO.read(is); double width = prevImage.getWidth(); double height = prevImage.getHeight(); int newWidth = 600; int newHeight = 800; BufferedImage image = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_BGR); Graphics graphics = image.createGraphics(); graphics.drawImage(prevImage, 0, 0, newWidth, newHeight, null); ImageIO.write(image, format, os); os.flush(); is.close(); os.close(); //ByteArrayOutputStream b = (ByteArrayOutputStream) os; return os; } /** * 读取某个目录下所有文件、文件夹 * @param path * @return LinkedHashMap<String,String> */ public static LinkedHashMap<String,String> getFiles(String path) { LinkedHashMap<String,String> files = new LinkedHashMap<String,String>(); File file = new File(path); File[] tempList = file.listFiles(); for (int i = 0; i < tempList.length; i++) { if (!tempList[i].isDirectory()) { files.put(tempList[i].getName(),tempList[i].getPath()); } } return files; } public static void main(String[] args) { try { LinkedHashMap<String,String> files = getFiles("D:/img"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date beginDate = new Date(); System.out.println("开始:"+sdf.format(beginDate)); for (String fileName : files.keySet()) { InputStream is = new FileInputStream(new File(files.get(fileName))); OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+fileName)); resizeImage(is, os, 10, "jpg"); } Date endDate = new Date(); System.out.println("结束:"+sdf.format(endDate)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
方式二:裁剪图片(缺点:可能会使得图片展示不完全,只能取到图片中间部分的内容)
package com.test; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import javax.imageio.ImageIO; public class ImgCrop { /** * 改变图片的大小到宽为size,然后高随着宽等比例变化 * @param is 上传的图片的输入流 * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream * @param size 新图片的宽 * @param format 新图片的格式 * @throws IOException */ public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException { BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR); Graphics graphics = image.createGraphics(); graphics.drawImage(bufferedimage, 0, 0, widht, height, null); ImageIO.write(image, format, os); os.flush(); os.close(); return os; } /** * * 裁剪图片方法 * * @param bufferedImage 图像源 * * @param startX 裁剪开始x坐标 * * @param startY 裁剪开始y坐标 * * @param endX 裁剪结束x坐标 * * @param endY 裁剪结束y坐标 * * @return */ public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) { int width = Image.getWidth(); int height = Image.getHeight(); if (startX == -1) { startX = 0; } if (startY == -1) { startY = 0; } if (endX == -1) { endX = width - 1; } if (endY == -1) { endY = height - 1; } BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4); for (int x = startX; x < endX; ++x) { for (int y = startY; y < endY; ++y) { int rgb = Image.getRGB(x, y); result.setRGB(x - startX, y - startY, rgb); } } return result; } public static void main(String[] args) throws IOException { //原始图片路径 String imagePath = "D:/image"; File imageFile = new File(imagePath); File[] imageFiles = imageFile.listFiles(); for (File fimage : imageFiles) { BufferedImage bufferedimage=ImageIO.read(fimage); int width = bufferedimage.getWidth(); int height = bufferedimage.getHeight(); OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName())); resizeImage(bufferedimage,width,height,os,"jpg"); os.flush(); os.close(); } //过程图片路径 String path = "D:/img"; dealImg(path); String cachePath = "D:/imgCache"; File file = new File(cachePath); File[] files = file.listFiles(); while(files.length>0) { dealImg(cachePath); file = new File(path); files = file.listFiles(); } } /** * 处理图片 * @param path 文件夹路径 */ private static void dealImg(String path) { try { File file = new File(path); File[] files = file.listFiles(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date beginDate = new Date(); System.out.println(path+"begin:"+sdf.format(beginDate)); for (File f : files) { BufferedImage bufferedimage=ImageIO.read(f); Double width = (double) bufferedimage.getWidth(); Double height = (double) bufferedimage.getHeight(); if (width<900||height<1200) { while (width<900||height<1200) { width=width*1.1; height=height*1.1; } OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName())); resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg"); f.delete(); os.flush(); os.close(); continue; } //目标将图片裁剪成 宽900,高1200 if (width > 900) { /*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/ bufferedimage=cropImage(bufferedimage,(int) ((width - 900) / 2),0,(int) (width - (width-900) / 2),height.intValue()); if (height > 1200) { bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),900,(int) (height - (height - 1200) / 2) ); } }else{ if (height > 1200) { bufferedimage=cropImage(bufferedimage,0,(int) ((height - 1200) / 2),width.intValue(),(int) (height - (height - 1200) / 2) ); } } OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName())); ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片 f.delete(); os.flush(); os.close(); } Date endDate = new Date(); System.out.println(path+"end:"+sdf.format(endDate)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
裁剪图片优化版:
package com.jeecg.util; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import javax.imageio.ImageIO; public class ImgCrop { /** * 改变图片的大小到宽为size,然后高随着宽等比例变化 * @param is 上传的图片的输入流 * @param os 改变了图片的大小后,把图片的流输出到目标OutputStream * @param size 新图片的宽 * @param format 新图片的格式 * @throws IOException */ public static OutputStream resizeImage(BufferedImage bufferedimage,int widht,int height,OutputStream os, String format) throws IOException { BufferedImage image = new BufferedImage(widht, height, BufferedImage.TYPE_INT_BGR); Graphics graphics = image.createGraphics(); graphics.drawImage(bufferedimage, 0, 0, widht, height, null); ImageIO.write(image, format, os); os.flush(); os.close(); return os; } /** * * 裁剪图片方法 * * @param bufferedImage 图像源 * * @param startX 裁剪开始x坐标 * * @param startY 裁剪开始y坐标 * * @param endX 裁剪结束x坐标 * * @param endY 裁剪结束y坐标 * * @return */ public static BufferedImage cropImage(BufferedImage Image, int startX, int startY, int endX, int endY) { int width = Image.getWidth(); int height = Image.getHeight(); if (startX == -1) { startX = 0; } if (startY == -1) { startY = 0; } if (endX == -1) { endX = width - 1; } if (endY == -1) { endY = height - 1; } BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4); for (int x = startX; x < endX; ++x) { for (int y = startY; y < endY; ++y) { int rgb = Image.getRGB(x, y); result.setRGB(x - startX, y - startY, rgb); } } return result; } public static void main(String[] args) throws IOException { totalImg(300,400); } /** * 所有图片调用总方法 */ public static void totalImg(Integer wid,Integer hei) throws IOException, FileNotFoundException { File file1 = new File("D:/image/"); if (!file1.exists()) { file1.mkdirs(); } File file2 = new File("D:/img/"); if (!file2.exists()) { file2.mkdirs(); } File file3 = new File("D:/imgCache/"); if (!file3.exists()) { file3.mkdirs(); } File file4 = new File("D:/imgCopy/"); if (!file4.exists()) { file4.mkdirs(); } //原始图片路径 String imagePath = "D:/image"; File imageFile = new File(imagePath); File[] imageFiles = imageFile.listFiles(); for (File fimage : imageFiles) { BufferedImage bufferedimage=ImageIO.read(fimage); int width = bufferedimage.getWidth(); int height = bufferedimage.getHeight(); OutputStream os = new FileOutputStream(new File("D:/img/"+fimage.getName())); resizeImage(bufferedimage,width,height,os,"jpg"); os.flush(); os.close(); } //过程图片路径 String path = "D:/img"; dealImg(path,wid,hei,1); String cachePath = "D:/imgCache"; File file = new File(cachePath); File[] files = file.listFiles(); while(files.length>0) { dealImg(cachePath,wid,hei,2); file = new File(path); files = file.listFiles(); } } /** * 处理图片 * @param path 文件夹路径 */ private static void dealImg(String path,Integer wid,Integer hei,Integer type) { try { File file = new File(path); File[] files = file.listFiles(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date beginDate = new Date(); System.out.println(path+"begin:"+sdf.format(beginDate)); for (File f : files) { BufferedImage bufferedimage=ImageIO.read(f); Double width = (double) bufferedimage.getWidth(); Double height = (double) bufferedimage.getHeight(); Double w = 0.00; Double h = 0.00; if (type==1) { if (width<wid||height<hei) { while (width<wid||height<hei) { width=width*1.1; height=height*1.1; } OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName())); resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg"); f.delete(); os.flush(); os.close(); continue; }else if (width>wid&&height>hei) { while (width>wid&&height>hei) { width=width*0.9; height=height*0.9; if (width<wid||height<hei) { if (width<=height) { w = wid.doubleValue(); h = ((wid-width)/wid)*height+height; }else{ h = hei.doubleValue(); w = ((hei-height)/hei)*width+width; } }else{ w = width; h = height; } } width = w; height = h; OutputStream os = new FileOutputStream(new File("D:/imgCache/"+f.getName())); resizeImage(bufferedimage,width.intValue(),height.intValue(),os,"jpg"); f.delete(); os.flush(); os.close(); continue; } } //目标将图片裁剪成 宽900,高1200 if (width > wid) { /*开始x坐标 开始y坐标 结束x坐标 结束y坐标*/ bufferedimage=cropImage(bufferedimage,(int) ((width - wid) / 2),0,(int) (width - (width-wid) / 2),height.intValue()); if (height > hei) { bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),wid,(int) (height - (height - hei) / 2) ); } }else{ if (height > hei) { bufferedimage=cropImage(bufferedimage,0,(int) ((height - hei) / 2),width.intValue(),(int) (height - (height - hei) / 2) ); } } OutputStream os = new FileOutputStream(new File("D:/imgCopy/"+f.getName())); ImageIO.write(bufferedimage, "jpg", os); //输出裁剪图片 f.delete(); os.flush(); os.close(); } Date endDate = new Date(); System.out.println(path+"end:"+sdf.format(endDate)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }