ImageSizer
package com.itcast.utils;
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;
/**
* 图像压缩工具
* @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);
}
}
分享到:
相关推荐
使用两中方法进行压缩,可以只改变图片大小,如,原图片100kb,压缩后变成40kb。并且不改变宽高。 一.使用ImageMagick进行压缩类-Aa.java ...使用java自带的awt进行压缩,无需加入第三方jar,在ImageSizer.java中。
这个"图片压缩类"可能是一个Java程序,由名为`ImageSizer.java`的源代码文件实现。这个工具很可能用于减小图像文件的大小,以提高加载速度、节省存储空间或降低网络带宽消耗。 首先,我们要理解图片压缩的基本原理...
`ImageSizer.java`这个文件很可能是实现了一个简单的图片压缩工具类。在这个类中,开发者可能已经实现了对JPG、PNG和GIF(非动态)格式图片的压缩功能。下面我们将深入探讨Java中图片压缩的相关知识点。 1. **Java...
`ImageSizer.java`文件很可能是包含上述代码的一个Java源文件,用户可以通过编译和运行该文件来实现图片的压缩。 总结起来,Java中的图片压缩涉及读取、调整大小和保存图像,这通常通过`BufferedImage`和`Graphics...
"ImageSizer.java"很可能是一个Java实现的图片压缩工具类。在Java中处理图片,我们通常会用到`java.awt.image`和`javax.imageio`这两个包,它们提供了读取、写入和处理图像的基本功能。`ImageIO`类用于读写各种图像...
在提供的压缩包文件中,ImageSizer.exe是Moo0 ImageSizer的主要应用程序,用户可以直接运行此文件来启动软件。而去脚本之家看看.url和服务器软件.url则是网站链接,可能是开发者提供的技术支持或者相关资源下载的...
1. **ImageSizer.exe**:这是图像大小调节器的主要执行文件,双击即可运行该软件。它内置了图像处理算法,能够快速计算并调整图像像素,同时保持图像质量尽可能不受损失。用户只需选择待处理的图片,设置新的尺寸,...
最后,压缩包中的"ImageSizer.exe"很可能是这个图片缩小工具的可执行文件,用户只需双击运行即可开始使用。在使用过程中,注意确保下载来源的安全性,避免安装携带恶意软件的版本。同时,为了保护原图,建议在操作前...
Image Resizer 的目的是在几秒钟内调整您 DND(拖放)的图像大小...如果您的互联网连接速度较慢(就像...如果您对此应用程序有任何建议、愿望或“坏话”,您可以通过我的电子邮件地址与我联系:imagesizer@gmail.com
ImageSizer 该项目的目的是将对象图像适当地缩放为背景图像。 安装并运行 确保通过使用requirements.txt文件解决所有依赖关系 克隆仓库git clone 通过运行python3 yolo3.py创建python3 yolo3.py模型 您应该注意到...
支持图片、动画压缩工具类,是ImageSizer增强版
ExpressionEngine ImageSizer-改进 此ExpressionEngine插件将把JPG GIF或PNG图像的大小调整为EE标签中指定的所需大小,并将调整大小后的图像缓存到缓存文件夹中。 如果更新原始图像,将创建新的调整大小版本。 如果...