如何在Java中减小图像文件大小

9

我希望在将图片保存到服务器之前,能够减小已上传图片的文件大小(以减少加载时间)。我该如何使用Java实现?


你可以将图像保存为诸如JPEG或PNG之类的压缩格式。 - christian
4个回答

10

实际上我说的是文件大小(3MB -> 200KB),而不是图像的尺寸。这也包括它们吗? - Anand
是的,这是同样的事情 - 文件大小主要由图像尺寸(以及可能使用的图像压缩格式)定义。 - Gabriel Reid

3

以下代码可以帮助您调整图像大小并保持图像质量。

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
             if (!isMultipart) {
             } else {
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
                List items = null;
                try {
                     items = upload.parseRequest(request);
                } catch (FileUploadException e) {
                     System.out.println("Unable to load image" +  e.getMessage());}
                Iterator itr = items.iterator();
                while(itr.hasNext()) {
                     System.out.println(items.size());
                       FileItem item = (FileItem) itr.next();
                       if (!item.isFormField()) {
                          try {
                                 int size = 200;// size of the new image.
                                 //take the file as inputstream.
                                 InputStream imageStream = item.getInputStream();
                                 //read the image as a BufferedImage.
                                 BufferedImage image = javax.imageio.ImageIO.read(imageStream); 
                                 //cal the sacleImage method.
                                 BufferedImage newImage = scaleImage(image, size);
                                 String path = getServletContext().getRealPath("/image");
                                 //write file.
                                 File file = new File(path, "testimage.jpg");
                                 ImageIO.write(newImage, "JPG", file);
                          } catch (Exception e) {
                               System.out.println("Unable to save the image" + e.getMessage());
                               //System.out.println(path);
                  }//if
                }//iter
        }
    private BufferedImage scaleImage(BufferedImage bufferedImage, int size) {
         double boundSize = size;
            int origWidth = bufferedImage.getWidth();
            int origHeight = bufferedImage.getHeight();
            double scale;
            if (origHeight > origWidth)
                scale = boundSize / origHeight;
            else
                scale = boundSize / origWidth;
             //* Don't scale up small images.
            if (scale > 1.0)
                return (bufferedImage);
            int scaledWidth = (int) (scale * origWidth);
            int scaledHeight = (int) (scale * origHeight);
            Image scaledImage = bufferedImage.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
            // new ImageIcon(image); // load image
            // scaledWidth = scaledImage.getWidth(null);
            // scaledHeight = scaledImage.getHeight(null);
            BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = scaledBI.createGraphics();
                 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(scaledImage, 0, 0, null);
            g.dispose();
            return (scaledBI);
    }

1
/*
 * This will get an image file and returns a byte array resized by the given value.
 */
package tajneed;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.imageio.ImageIO;
import org.imgscalr.Scalr;

public class ImageResizer {

    public static byte[] resize(File icon) {
        try {
           BufferedImage originalImage = ImageIO.read(icon);

           originalImage= Scalr.resize(originalImage, Scalr.Method.QUALITY, Scalr.Mode.FIT_EXACT, 128, 153);
            //To save with original ratio uncomment next line and comment the above.
            //originalImage= Scalr.resize(originalImage, 153, 128);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(originalImage, "jpg", baos);
            baos.flush();
            byte[] imageInByte = baos.toByteArray();
            baos.close();
            return imageInByte;
        } catch (Exception e) {
            return null;
        }


    }
}

0
使用img4java来减小您的图像文件大小。
public static void main(String[] args) throws IOException, InterruptedException, IM4JavaException {
     IMOperation op = new IMOperation();
     //op.resize(500, 500, '>');
     //op.quality(85.0); // jpeg quality (%)
     op.strip(); 
     op.interlace("Plane");
     op.define("jpeg:extent=5kb");
     op.addImage("/home/j/Scrivania/originale.jpg"); // original file
     op.addImage("/home/j/Scrivania/nuova_m.jpg"); // destination
     
     ConvertCmd convert = new ConvertCmd();
     convert.run(op);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接