本源码来自于视频教程
/**
* 图像压缩工具
* @author lihuoming@sohu.com
*
*/
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);
}
}
分享到:
相关推荐
本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要理解图片压缩的基本原理。图片压缩主要有两种类型:有损压缩和无损压缩。有损压缩会牺牲一部分...
以下是一个简单的Java图片压缩示例: ```java import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class ImageCompressor { public ...
通过理解等比缩放和图片压缩的概念,以及如何在Java中实现它们,你可以有效地管理图像资源,提升应用的效率和用户体验。在实际操作中,你还可以探索更多高级功能,如色彩空间转换、滤波和增强等,以进一步优化你的...
在Java编程语言中,处理图片压缩是一个常见的任务,特别是在网页开发、存储优化或者移动应用中。这个主题主要涉及如何利用Java来减少图片文件的大小,包括静态图片(如JPEG、PNG)以及动态图片(如GIF)。下面我们将...
首先,我们来看看使用Java标准库中的`javax.imageio.ImageIO`类进行图片压缩。`ImageIO`类提供了读取、写入和处理图像的功能。以下是一个简单的示例,展示如何读取一个图片文件,然后以较低的质量重新保存,从而达到...
在Java编程环境中,图片压缩和生成缩略图是常见的任务,尤其在处理大量图像数据或者优化网站性能时显得尤为重要。本文将深入探讨如何利用Java进行图片处理,包括压缩和生成缩略图的关键技术。 首先,Java提供了丰富...
本篇文章将详细介绍如何利用Java来处理这个问题,特别是如何编写一个图片压缩和旋转的工具类。 首先,我们需要引入处理图像元数据和压缩的库。在Java中,一个常用的库是Apache的Commons Imaging,它以前称为JAI-...
`ImageSizer.java`这个文件很可能是实现了一个简单的图片压缩工具类。在这个类中,开发者可能已经实现了对JPG、PNG和GIF(非动态)格式图片的压缩功能。下面我们将深入探讨Java中图片压缩的相关知识点。 1. **Java...
以上步骤展示了如何在Java中实现图片压缩和打包的基本流程。在实际应用中,你可能需要根据具体需求进行调整,例如添加异常处理、优化性能或者支持更多的图片格式。提供的`creatFile`方法可能整合了这些步骤,提供一...
本篇文章将深入探讨如何使用Java来实现GIF和JPEG(JPG)格式图片的压缩,以及如何控制压缩率。我们将主要关注两个关键库:Java标准库(Java SE)中的`javax.imageio`包和第三方库如Apache Commons Imaging (以前称为...
在IT领域,图片压缩是一项重要的技术,特别是在网络传输、存储和显示方面。"图片压缩到最小.rar"这个压缩包文件的标题和...易语言作为一款亲民的编程工具,可以帮助开发者实现各种图片压缩功能,满足不同场景的需求。
总之,Java图片压缩工具利用Java的图像处理库,结合不同的压缩策略,能够有效地对图片进行压缩,满足不同场景的需求。无论是简单的尺寸调整还是复杂的质量控制,Java都能提供足够的工具和灵活性来处理这些问题。对于...
综上所述,Java结合Apache Commons Imaging库可以实现对图片的EXIF信息读取和保存,通过调整JPEG压缩质量实现图片压缩,并利用Java 2D API轻松添加边框。这些技术在实际项目中非常实用,帮助开发者处理和优化图片...
- 图片压缩通常分为有损和无损两种。无损压缩如PNG、GIF,压缩后能完全恢复原始数据;有损压缩如JPEG,压缩过程中会丢失部分信息,但能实现更高的压缩比。 - JPEG压缩通常通过DCT(离散余弦变换)实现,可以通过...
本文将深入探讨Java实现图片压缩的源码及其相关知识点。 首先,我们需要了解图像压缩的基本原理。图像压缩主要分为有损压缩和无损压缩。有损压缩会丢失部分图像数据,但能获得更高的压缩比,例如JPEG格式;而无损...
总的来说,Java提供了强大的图像处理能力,通过组合使用标准库和第三方库,可以轻松实现图片压缩和加水印的需求。在实际项目中,应根据具体需求选择合适的方法和库,同时注意优化性能和内存使用,以提供高效、稳定的...
综上所述,Luban是一个针对Android平台的高效图片压缩工具,它通过智能压缩算法实现了类似微信朋友圈的图片压缩效果,对于开发者来说是一个非常实用的库。在使用时,需注意Java版本兼容性以及合理配置压缩参数,以...
本篇将详细讲解如何利用Java进行图片压缩,以及一些常用的Java图片压缩库。 首先,理解图片压缩的基本原理至关重要。图片压缩分为有损压缩和无损压缩。无损压缩可以恢复原始图像,但压缩比有限;有损压缩通过减少...
总结,阿里云SimpleImage是Java开发者的强大图片处理工具,能够轻松实现图片压缩和裁剪,帮助优化图片质量和大小,适用于各种需要处理图片的场景。通过简单易懂的API,开发者可以快速集成到自己的项目中,提高图片...
在Java编程语言中,实现文件的压缩和解压缩是一项常见的任务,特别是在开发Web应用程序时。本文将深入探讨如何使用Java API来完成这项工作,以及它在实际项目中的应用。 Java提供了一个名为`java.util.zip`的包,...