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);
}
}
测试类
import java.io.File;
import java.io.IOException;
import org.junit.Test;
public class ImageTest {
@Test
public void createImage(){
try {
ImageSizer.resize(new File("d:\\100_2844.gif"), new File("d:\\testabc.gif"), 200, "gif");
} catch (IOException e) {
e.printStackTrace();
}
}
}
ex
function getTopSell(typeid){
var salespromotion = document.getElementById('salespromotion');
if(salespromotion && typeid!=""){
salespromotion.innerHTML= "数据正在加载...";
send_request(function(value){salespromotion.innerHTML=value},
"<html:rewrite action="/product/switch"/>?method=topsell&typeid="+ typeid, true);
}
}
分享到:
相关推荐
下面我们将详细探讨批量图片压缩处理工具的工作原理、常见方法以及其在实际应用中的重要性。 批量图片压缩处理工具的核心功能是改变图片的格式、调整大小和优化图片质量,从而达到减小图片文件大小的目的。其中,...
本文将详细介绍三种常见的Android图片压缩处理方法:质量压缩、获取缩略图以及图片缩放,并提供相应的示例代码。 1. **质量压缩方法** 质量压缩是通过调整图片的压缩比例来减小文件大小。在Android中,我们可以...
总的来说,VB6图片压缩处理源码可能涵盖了图像读取、压缩算法应用、图像尺寸调整、文件I/O以及用户交互等多个方面,体现了VB6结合外部库进行图像处理的能力。通过理解这些知识点,可以对源码进行深入研究和扩展,以...
在IT行业中,图片压缩处理工具是开发者和设计师日常工作中不可或缺的一部分。这个名为“一个图片压缩处理工具”的项目,显然专注于使用JavaScript技术来优化和管理图片资源,尤其适用于网页和应用程序中的图片展示。...
在Java编程语言中,处理图片压缩是一项常见的任务,特别是在存储、传输或展示大量图像资源时。本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要...
图片压缩处理通常分为无损压缩和有损压缩两种方式: - **无损压缩**:压缩过程中不丢失任何信息,解压后的图片与原图完全一致。 - **有损压缩**:允许一定程度的信息损失,通常是在人眼难以察觉的情况下进行,以...
《PhotoScape图片压缩处理深度解析》 在数字化时代,图片处理已经成为我们日常生活和工作中不可或缺的一部分。无论是为了分享社交媒体上的照片,还是为了节省存储空间,图片压缩都扮演着至关重要的角色。PhotoScape...
了解各种算法的优缺点,结合实际需求选择合适的压缩方法,是优化图片压缩处理的重要步骤。 9. 图片优化:除了压缩外,还可以通过其他手段优化图片,如裁剪不必要的区域、转换为更适合网页的格式(如WebP)、使用...
在C# Core中进行图片处理是一项常见的任务,其中包括图片压缩和剪切操作。无损压缩和剪切技术在保持原始图像质量的同时,可以减小文件大小或改变图像的形状。以下将详细介绍C# Core中如何实现这些功能。 首先,我们...
在IT领域,图片压缩处理和转换是常见的任务,尤其对于那些需要上传或分享大量图片的用户来说更是如此。本文将详细解析"图片压缩处理转换软件"的核心知识点,并围绕"图片处理"、"压缩"和"JPG"这三个标签展开讨论。 ...
Java中图片压缩处理是一项重要的技术手段,尤其在Web应用中,用户上传图片时...通过上述的Java图片压缩处理方法,可以在不同的应用场景中,灵活地对上传的图片进行处理,以达到节省存储空间、加快页面加载速度的目的。
对于"图片压缩到最小",我们可能需要采用有损压缩方法,因为它们可以更有效地减小文件大小。 在易语言中,实现图片压缩通常涉及以下几个步骤: 1. **读取图片**:使用易语言提供的图形处理函数,如“读取图形文件...
"java图片压缩处理 支持gif"这个标题表明我们将探讨如何使用Java来处理和压缩GIF动态图,因为GIF格式支持动画,处理起来相对复杂。 首先,Java标准库提供了`javax.imageio`包,它包含`ImageIO`类,可以用来读取、...
在Flex中,我们可以使用BitmapData对象和相关方法来实现自定义的图片压缩逻辑。 "imageLoading"这个文件名可能表示该示例涉及加载图片到应用程序中,然后进行压缩。在Flex中,可以使用Loader类来加载图片资源。一旦...
这个"android图片压缩的处理.zip"文件很可能是包含了一些示例代码或库,用于帮助开发者了解和实现Android平台上的图片压缩技术。下面将详细讨论Android图片压缩的基本原理、常用方法以及可能涉及到的技术点。 1. **...
在Android开发中,我们可以使用多种方法实现图片压缩。例如,使用BitmapFactory的decode方法,配合Options对象的inSampleSize属性,可以设置图片解码时的缩放比例,从而降低图片的分辨率,达到压缩的目的。这种方法...
本文将深入探讨“图片批量压缩处理多个文件”的技术细节、相关软件以及使用方法。 一、图片压缩原理 图片压缩的基本目标是减小图片文件的大小,以便于存储和传输。主要有两种类型的压缩方式:无损压缩和有损压缩。...
下面我们将详细探讨JS图片压缩的原理、方法和常见库。 1. 图片压缩原理: 图片压缩分为无损压缩和有损压缩。无损压缩可以完全恢复原始图像,如PNG使用的LZW算法;有损压缩则会丢失部分信息,如JPEG使用的DCT(离散...
### Java版图片压缩方法:不失真,不裁剪 ...通过合理运用API和算法,可以实现高效、高质量的图片压缩处理。在实际项目中,开发者应根据具体需求选择合适的压缩策略和优化手段,以达到最佳的压缩效果。