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的...
Grearo图片压缩工具 功能介绍【必读】: 1 图片批量压缩(30以内,依个人机器以及被压缩图片大小而定); 2 图片限定宽度,等比例压缩; 3 图片限定高度,等比例压缩; 4 图片限定高度,宽度压缩;...
在IT领域,图片压缩工具是图像处理中不可或缺的一部分。标题提到的"jpg,bmp图片压缩工具"主要关注的是两种常见的图像格式:JPEG(Joint Photographic Experts Group)和BMP(Bitmap)。这两种格式各有特点,但在...
《本地图片压缩工具:高效无损的图像管理实践》 在日常的工作与生活中,我们常常会遇到需要处理大量图片的情况,比如整理照片、制作PPT或者上传社交媒体等。此时,图片的大小和尺寸就成为了一个重要的问题。"本地...
此时,一款“超级好用的图片压缩工具”就显得尤为重要。这款工具能帮助我们将图片压缩至理想的大小,同时还能进行批量操作,极大地提高了工作效率。 首先,我们要理解图片压缩的基本原理。图片是由像素组成的,每个...
PNG图片压缩工具是一种针对PNG(Portable Network Graphics)格式图像的专业优化软件,主要目的是在保持图像质量的同时减小文件大小。PNG格式因其无损压缩和透明度支持而被广泛使用,但有时原始PNG文件可能会占用较...
图片压缩工具可以帮助我们减小图片文件的大小,以便更有效地利用存储空间,加快网页加载速度,以及节省网络带宽。本文将详细讲解图片压缩的基本原理、常见方法以及如何使用“图片压缩.exe”这样的工具来优化图片大小...
本文将深入探讨“图片压缩工具”的概念、原理以及如何利用它来优化图像资源。 首先,我们来看看标题“图片压缩工具.rar”所暗示的信息。这个压缩包包含了能够压缩图片的工具,其格式为RAR,这是一种常见的文件压缩...
"超强JPG图片压缩工具"就是一款专注于解决这个问题的应用程序,它的主要功能是帮助用户减小JPG图片文件的大小,从而节省存储空间,提高上传速度,以及优化网页加载效率。 首先,我们来了解一下JPG(也写作JPEG)...
标题中的“小工具之超级图片压缩工具”暗示我们讨论的主题是一款专门用于压缩图片的软件工具。这款工具的特点在于它能够实现高倍压缩,同时保持图片的质量几乎不受影响。这意味着用户可以在不牺牲图像清晰度的前提下...
标题中的“图片压缩工具(附注册码)”指的是一个专门用于处理图像文件的软件,它提供了批量压缩功能,能够帮助用户有效地减小图片文件的大小。这类工具在日常使用中非常常见,尤其对于网络分享、论坛上传或者存储...
标题中的“干净小巧功能强大的图片压缩工具”指的是一个专门针对图片压缩的应用程序,它具有轻量级、不占用过多系统资源以及高效压缩的特点。这款工具名为jpgcompact,正如描述中所提到的,它非常强大,但体积却很小...
为了解决这个问题,出现了各种图片压缩工具,如我们所讨论的“图片压缩工具”,这是一款已经注册并可直接使用的软件。 图片压缩的原理主要涉及两个方面:有损压缩和无损压缩。有损压缩会牺牲部分图像质量来减小文件...
PNG图片压缩工具pngquant是一款高效的图像处理软件,专门用于优化PNG(Portable Network Graphics)格式的图像,以减小文件大小而不显著降低图像质量。在现代网页设计和移动应用开发中,图片的质量和大小是影响加载...
"JPG图片压缩工具V2.0" 是一款专为JPG(以及BMP格式)图片设计的软件,版本号为2.0,表明这是一款经过升级和优化的产品,可能包含了更多的功能和性能提升。该工具的核心功能是进行图片的批量压缩,以减少图片的文件...
PNG图片压缩工具是一种高效优化图像文件大小的软件,尤其适用于需要高质量、透明度支持的图像。PNG(Portable Network Graphics)格式因其无损压缩和广泛的颜色范围而被广泛使用,但通常其文件大小比其他格式如JPEG...
这里我们介绍的是一款专为MAC用户设计的图片压缩工具——ImageOptim,它尤其适用于处理PNG图片,能够帮助开发者有效地减小图片的体积,同时保持良好的视觉效果。 ImageOptim是一款免费且易用的工具,旨在压缩PNG、...
本文将深入探讨一款被描述为“小巧的图片压缩工具,压缩比例可调”的软件,它允许用户批量处理图片,降低文件大小而不明显影响画质。 首先,我们来了解图片压缩的基本原理。图片是由像素组成的,每个像素包含颜色...