`
115893520
  • 浏览: 142981 次
  • 性别: 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;

/**
 * 图像压缩工具
 * @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中3种图片压缩处理方法

    本文将详细介绍三种常见的Android图片压缩处理方法:质量压缩、获取缩略图以及图片缩放,并提供相应的示例代码。 1. **质量压缩方法** 质量压缩是通过调整图片的压缩比例来减小文件大小。在Android中,我们可以...

    VB6图片压缩处理源码

    总的来说,VB6图片压缩处理源码可能涵盖了图像读取、压缩算法应用、图像尺寸调整、文件I/O以及用户交互等多个方面,体现了VB6结合外部库进行图像处理的能力。通过理解这些知识点,可以对源码进行深入研究和扩展,以...

    一个图片压缩处理工具

    在IT行业中,图片压缩处理工具是开发者和设计师日常工作中不可或缺的一部分。这个名为“一个图片压缩处理工具”的项目,显然专注于使用JavaScript技术来优化和管理图片资源,尤其适用于网页和应用程序中的图片展示。...

    java图片压缩处理(可以压缩为任意大小

    在Java编程语言中,处理图片压缩是一项常见的任务,特别是在存储、传输或展示大量图像资源时。本主题将深入探讨如何使用Java实现图片压缩,并能够将其调整到任意大小,同时保持图片质量并避免变形。 首先,我们需要...

    图片上传压缩处理源码

    图片压缩处理通常分为无损压缩和有损压缩两种方式: - **无损压缩**:压缩过程中不丢失任何信息,解压后的图片与原图完全一致。 - **有损压缩**:允许一定程度的信息损失,通常是在人眼难以察觉的情况下进行,以...

    PhotoScape图片压缩处理

    《PhotoScape图片压缩处理深度解析》 在数字化时代,图片处理已经成为我们日常生活和工作中不可或缺的一部分。无论是为了分享社交媒体上的照片,还是为了节省存储空间,图片压缩都扮演着至关重要的角色。PhotoScape...

    图片批量压缩处理

    了解各种算法的优缺点,结合实际需求选择合适的压缩方法,是优化图片压缩处理的重要步骤。 9. 图片优化:除了压缩外,还可以通过其他手段优化图片,如裁剪不必要的区域、转换为更适合网页的格式(如WebP)、使用...

    C# core 图片压缩 图片无损压缩 图片无损剪切 无损图片压缩 无损图片剪切

    在C# Core中进行图片处理是一项常见的任务,其中包括图片压缩和剪切操作。无损压缩和剪切技术在保持原始图像质量的同时,可以减小文件大小或改变图像的形状。以下将详细介绍C# Core中如何实现这些功能。 首先,我们...

    图片压缩处理转换软件

    在IT领域,图片压缩处理和转换是常见的任务,尤其对于那些需要上传或分享大量图片的用户来说更是如此。本文将详细解析"图片压缩处理转换软件"的核心知识点,并围绕"图片处理"、"压缩"和"JPG"这三个标签展开讨论。 ...

    Java中上传图片压缩处理的方法示例

    Java中图片压缩处理是一项重要的技术手段,尤其在Web应用中,用户上传图片时...通过上述的Java图片压缩处理方法,可以在不同的应用场景中,灵活地对上传的图片进行处理,以达到节省存储空间、加快页面加载速度的目的。

    易语言图片压缩到最小

    对于"图片压缩到最小",我们可能需要采用有损压缩方法,因为它们可以更有效地减小文件大小。 在易语言中,实现图片压缩通常涉及以下几个步骤: 1. **读取图片**:使用易语言提供的图形处理函数,如“读取图形文件...

    java图片压缩处理 支持gif

    "java图片压缩处理 支持gif"这个标题表明我们将探讨如何使用Java来处理和压缩GIF动态图,因为GIF格式支持动画,处理起来相对复杂。 首先,Java标准库提供了`javax.imageio`包,它包含`ImageIO`类,可以用来读取、...

    图片压缩flex demo

    在Flex中,我们可以使用BitmapData对象和相关方法来实现自定义的图片压缩逻辑。 "imageLoading"这个文件名可能表示该示例涉及加载图片到应用程序中,然后进行压缩。在Flex中,可以使用Loader类来加载图片资源。一旦...

    android图片压缩的处理.zip

    这个"android图片压缩的处理.zip"文件很可能是包含了一些示例代码或库,用于帮助开发者了解和实现Android平台上的图片压缩技术。下面将详细讨论Android图片压缩的基本原理、常用方法以及可能涉及到的技术点。 1. **...

    图片压缩节约内存

    在Android开发中,我们可以使用多种方法实现图片压缩。例如,使用BitmapFactory的decode方法,配合Options对象的inSampleSize属性,可以设置图片解码时的缩放比例,从而降低图片的分辨率,达到压缩的目的。这种方法...

    图片批量压缩处理多个文件软件下载

    本文将深入探讨“图片批量压缩处理多个文件”的技术细节、相关软件以及使用方法。 一、图片压缩原理 图片压缩的基本目标是减小图片文件的大小,以便于存储和传输。主要有两种类型的压缩方式:无损压缩和有损压缩。...

    js图片压缩

    下面我们将详细探讨JS图片压缩的原理、方法和常见库。 1. 图片压缩原理: 图片压缩分为无损压缩和有损压缩。无损压缩可以完全恢复原始图像,如PNG使用的LZW算法;有损压缩则会丢失部分信息,如JPEG使用的DCT(离散...

    java版图片压缩方法

    ### Java版图片压缩方法:不失真,不裁剪 ...通过合理运用API和算法,可以实现高效、高质量的图片压缩处理。在实际项目中,开发者应根据具体需求选择合适的压缩策略和优化手段,以达到最佳的压缩效果。

Global site tag (gtag.js) - Google Analytics