`
a274915611
  • 浏览: 3308 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

图片压缩工具

阅读更多
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
* 图像压缩工具
*
*/
public class ImageSizer {
    public static final MediaTracker tracker = new MediaTracker(new Component() {
        private static final long serialVersionUID = 1234162663955668507L;}
    );
    /**
     * @param originalFile 原图像
     * @param resizedFile 压缩后的图像
     * @param width 图像宽
     * @param format 图片格式 jpg, png, gif(非动画)
     * @throws IOException
     */
    public static void resize(File originalFile, File resizedFile, int width, String format) throws IOException {
        if(format!=null && "gif".equals(format.toLowerCase())){
        resize(originalFile, resizedFile, width, 1);
        return;
        }
        FileInputStream fis = new FileInputStream(originalFile);
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        int readLength = -1;
        int bufferSize = 1024;
        byte bytes[] = new byte[bufferSize];
        while ((readLength = fis.read(bytes, 0, bufferSize)) != -1) {
            byteStream.write(bytes, 0, readLength);
        }
        byte[] in = byteStream.toByteArray();
        fis.close();
        byteStream.close();
       
    Image inputImage = Toolkit.getDefaultToolkit().createImage( in );
        waitForImage( inputImage );
        int imageWidth = inputImage.getWidth( null );
        if ( imageWidth < 1 )
           throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );
        int imageHeight = inputImage.getHeight( null );
        if ( imageHeight < 1 )
           throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );
       
        // Create output image.
        int height = -1;
        double scaleW = (double) imageWidth / (double) width;
        double scaleY = (double) imageHeight / (double) height;
        if (scaleW >= 0 && scaleY >=0) {
            if (scaleW > scaleY) {
                height = -1;
            } else {
                width = -1;
            }
        }
        Image outputImage = inputImage.getScaledInstance( width, height, java.awt.Image.SCALE_DEFAULT);
        checkImage( outputImage );       
        encode(new FileOutputStream(resizedFile), outputImage, format);       
    }   

    /** Checks the given image for valid width and height. */
    private static void checkImage( Image image ) {
       waitForImage( image );
       int imageWidth = image.getWidth( null );
       if ( imageWidth < 1 )
          throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );
       int imageHeight = image.getHeight( null );
       if ( imageHeight < 1 )
          throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );
    }

    /** Waits for given image to load. Use before querying image height/width/colors. */
    private static void waitForImage( Image image ) {
       try {
          tracker.addImage( image, 0 );
          tracker.waitForID( 0 );
          tracker.removeImage(image, 0);
       } catch( InterruptedException e ) { e.printStackTrace(); }
    }

    /** Encodes the given image at the given quality to the output stream. */
    private static void encode( OutputStream outputStream, Image outputImage, String format )
       throws java.io.IOException {
       int outputWidth  = outputImage.getWidth( null );
       if ( outputWidth < 1 )
          throw new IllegalArgumentException( "output image width " + outputWidth + " is out of range" );
       int outputHeight = outputImage.getHeight( null );
       if ( outputHeight < 1 )
          throw new IllegalArgumentException( "output image height " + outputHeight + " is out of range" );

       // Get a buffered image from the image.
       BufferedImage bi = new BufferedImage( outputWidth, outputHeight,
          BufferedImage.TYPE_INT_RGB );                                                  
       Graphics2D biContext = bi.createGraphics();
       biContext.drawImage( outputImage, 0, 0, null );
       ImageIO.write(bi, format, outputStream);
       outputStream.flush();     
    }
   
/**
* 缩放gif图片
* @param originalFile 原图片
* @param resizedFile 缩放后的图片
* @param newWidth 宽度
* @param quality 缩放比例 (等比例)
* @throws IOException
*/
    private static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException {
        if (quality < 0 || quality > 1) {
            throw new IllegalArgumentException("Quality has to be between 0 and 1");
        }
        ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
        Image i = ii.getImage();
        Image resizedImage = null;
        int iWidth = i.getWidth(null);
        int iHeight = i.getHeight(null);
        if (iWidth > iHeight) {
            resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
        } else {
            resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH);
        }
        // This code ensures that all the pixels in the image are loaded.
        Image temp = new ImageIcon(resizedImage).getImage();
        // Create the buffered image.
        BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null),
                                                        BufferedImage.TYPE_INT_RGB);
        // Copy image to buffered image.
        Graphics g = bufferedImage.createGraphics();
        // Clear background and paint the image.
        g.setColor(Color.white);
        g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
        g.drawImage(temp, 0, 0, null);
        g.dispose();
        // Soften.
        float softenFactor = 0.05f;
        float[] softenArray = {0, softenFactor, 0, softenFactor, 1-(softenFactor*4), softenFactor, 0, softenFactor, 0};
        Kernel kernel = new Kernel(3, 3, softenArray);
        ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
        bufferedImage = cOp.filter(bufferedImage, null);
        // Write the jpeg to a file.
        FileOutputStream out = new FileOutputStream(resizedFile);       
        // Encodes image as a JPEG data stream
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
        param.setQuality(quality, true);
        encoder.setJPEGEncodeParam(param);
        encoder.encode(bufferedImage);
    }
}
分享到:
评论

相关推荐

    事业单位图片压缩工具

    【事业单位图片压缩工具】是一款专为事业单位设计的高效图片压缩软件,它能够处理市面上常见的多种图片格式,如JPEG(JPG)、PNG、BMP、GIF等。该工具的主要功能在于大幅度减小图片的文件大小,例如,一个原本2MB的...

    C#图片压缩工具源代码

    Grearo图片压缩工具 功能介绍【必读】: 1 图片批量压缩(30以内,依个人机器以及被压缩图片大小而定); 2 图片限定宽度,等比例压缩; 3 图片限定高度,等比例压缩; 4 图片限定高度,宽度压缩;...

    jpg,bmp图片压缩工具

    在IT领域,图片压缩工具是图像处理中不可或缺的一部分。标题提到的"jpg,bmp图片压缩工具"主要关注的是两种常见的图像格式:JPEG(Joint Photographic Experts Group)和BMP(Bitmap)。这两种格式各有特点,但在...

    本地图片压缩工具.zip

    《本地图片压缩工具:高效无损的图像管理实践》 在日常的工作与生活中,我们常常会遇到需要处理大量图片的情况,比如整理照片、制作PPT或者上传社交媒体等。此时,图片的大小和尺寸就成为了一个重要的问题。"本地...

    超级好用的图片压缩工具

    此时,一款“超级好用的图片压缩工具”就显得尤为重要。这款工具能帮助我们将图片压缩至理想的大小,同时还能进行批量操作,极大地提高了工作效率。 首先,我们要理解图片压缩的基本原理。图片是由像素组成的,每个...

    PNG图片压缩工具

    PNG图片压缩工具是一种针对PNG(Portable Network Graphics)格式图像的专业优化软件,主要目的是在保持图像质量的同时减小文件大小。PNG格式因其无损压缩和透明度支持而被广泛使用,但有时原始PNG文件可能会占用较...

    图片压缩工具对图片大小进行压缩

    图片压缩工具可以帮助我们减小图片文件的大小,以便更有效地利用存储空间,加快网页加载速度,以及节省网络带宽。本文将详细讲解图片压缩的基本原理、常见方法以及如何使用“图片压缩.exe”这样的工具来优化图片大小...

    图片压缩工具.rar

    本文将深入探讨“图片压缩工具”的概念、原理以及如何利用它来优化图像资源。 首先,我们来看看标题“图片压缩工具.rar”所暗示的信息。这个压缩包包含了能够压缩图片的工具,其格式为RAR,这是一种常见的文件压缩...

    超强JPG图片压缩工具,减小图片文件大小,体积

    "超强JPG图片压缩工具"就是一款专注于解决这个问题的应用程序,它的主要功能是帮助用户减小JPG图片文件的大小,从而节省存储空间,提高上传速度,以及优化网页加载效率。 首先,我们来了解一下JPG(也写作JPEG)...

    小工具之超级图片压缩工具

    标题中的“小工具之超级图片压缩工具”暗示我们讨论的主题是一款专门用于压缩图片的软件工具。这款工具的特点在于它能够实现高倍压缩,同时保持图片的质量几乎不受影响。这意味着用户可以在不牺牲图像清晰度的前提下...

    图片压缩工具(附注册码)

    标题中的“图片压缩工具(附注册码)”指的是一个专门用于处理图像文件的软件,它提供了批量压缩功能,能够帮助用户有效地减小图片文件的大小。这类工具在日常使用中非常常见,尤其对于网络分享、论坛上传或者存储...

    干净小巧功能强大的图片压缩工具

    标题中的“干净小巧功能强大的图片压缩工具”指的是一个专门针对图片压缩的应用程序,它具有轻量级、不占用过多系统资源以及高效压缩的特点。这款工具名为jpgcompact,正如描述中所提到的,它非常强大,但体积却很小...

    图片压缩工具,已注册

    为了解决这个问题,出现了各种图片压缩工具,如我们所讨论的“图片压缩工具”,这是一款已经注册并可直接使用的软件。 图片压缩的原理主要涉及两个方面:有损压缩和无损压缩。有损压缩会牺牲部分图像质量来减小文件...

    PNG图片压缩工具 pngquant

    PNG图片压缩工具pngquant是一款高效的图像处理软件,专门用于优化PNG(Portable Network Graphics)格式的图像,以减小文件大小而不显著降低图像质量。在现代网页设计和移动应用开发中,图片的质量和大小是影响加载...

    JPG图片压缩工具V2.0_可批量压缩JPG.BMP图片_简体中文绿色免费版

    "JPG图片压缩工具V2.0" 是一款专为JPG(以及BMP格式)图片设计的软件,版本号为2.0,表明这是一款经过升级和优化的产品,可能包含了更多的功能和性能提升。该工具的核心功能是进行图片的批量压缩,以减少图片的文件...

    图片压缩工具PNG图片压缩工具压缩率高不失真

    PNG图片压缩工具是一种高效优化图像文件大小的软件,尤其适用于需要高质量、透明度支持的图像。PNG(Portable Network Graphics)格式因其无损压缩和广泛的颜色范围而被广泛使用,但通常其文件大小比其他格式如JPEG...

    图片压缩工具(MAC版)——iOS/Android开发用ImageOptim压缩png图片

    这里我们介绍的是一款专为MAC用户设计的图片压缩工具——ImageOptim,它尤其适用于处理PNG图片,能够帮助开发者有效地减小图片的体积,同时保持良好的视觉效果。 ImageOptim是一款免费且易用的工具,旨在压缩PNG、...

    小巧的图片压缩工具,压缩比例可调。

    本文将深入探讨一款被描述为“小巧的图片压缩工具,压缩比例可调”的软件,它允许用户批量处理图片,降低文件大小而不明显影响画质。 首先,我们来了解图片压缩的基本原理。图片是由像素组成的,每个像素包含颜色...

Global site tag (gtag.js) - Google Analytics