按比例缩小图片,并且保持图片格式不变的工具方法。

看过别人制作缩略图的方法。

http://caiceclb.iteye.com/blog/627219

http://hi.baidu.com/pep525/blog/item/7d068e3b9aa900ef15cecba4.html

有点不太满意:

无法识别原始图像的格式,要么全转为jpg,要么显式写死转换格式。

 

参考

http://www.exampledepot.com/egs/javax.imageio/DiscType.html

稍微改版了一下。图片转换为原始图像的格式。

 

省却网站编辑的时候图片上传之前需要缩小适合页面,节省时间。

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class ImageUtils {

	/**
	 * 按原始比例缩小图片至targetLength大小,并写入源文件(覆盖)。如果图片目标实际小于targetLength,则保持图像不变。
	 * isWidth参数表示targetLength 指的是宽度还是高度,true为宽度。
	 * 此方法在WEB应用中,可以方便裁剪提交上来的过大的图像,而不失真。
	 * @param imgsrc
	 * @param targetLength
	 * @param isWidth
	 */
	
	public static void reduceImg(String imgsrc, int targetLength,boolean isWidth) {   
	    try {   
	        File srcfile = new File(imgsrc);   
	        if (!srcfile.exists()) {   
	            return;   
	        }
	        Image src = ImageIO.read(srcfile);   
	        
	        //原始图像高和宽
	        int width  = src.getWidth(null);
	        int height  = src.getHeight(null);
	        
	        int widthdist = 0;
	        int heightdist = 0;
	        
	        //确定图像的缩放后的高和宽
	        if(isWidth){
	        	if(targetLength >= width) return;
	        	double scale = targetLength * 1.0/ width;
	        	widthdist = targetLength;
	        	heightdist = (int) (height*scale);
	        }else{
	        	if(targetLength >= height) return;
	        	double scale = targetLength * 1.0/ height;
	        	widthdist = (int) (width*scale);
	        	heightdist = targetLength;
	        }
	        
	        BufferedImage tag= new BufferedImage((int) widthdist, (int) heightdist,   
	                BufferedImage.TYPE_INT_RGB);   
	  
	        tag.getGraphics().drawImage(src.getScaledInstance(widthdist, heightdist,  Image.SCALE_FAST), 0, 0,  null);  //根据缩略图要求品质可以选择 Image.SCALE_SMOOTH
	        String formatName = getFormatName(srcfile);//此句必须在new FileOutputStream之前,因为是替换原图,FileOutputStream对象未关闭之前,ImageInputStream无法获得文件格式。
	        FileOutputStream out = new FileOutputStream(srcfile);
	        ImageIO.write(tag, formatName, out);
	        out.flush();
	        out.close();   
	  
	    } catch (IOException ex) {   
	        ex.printStackTrace();   
	    }   
	}  
	
	private static String getFormatName(File o) {
	    try {
	        // Create an image input stream on the image
	        ImageInputStream iis = ImageIO.createImageInputStream(o);

	        // Find all image readers that recognize the image format
	        Iterator iter = ImageIO.getImageReaders(iis);
	        if (!iter.hasNext()) {
	            // No readers found
	            return null;
	        }

	        // Use the first reader
	        ImageReader reader = (ImageReader)iter.next();

	        // Close stream
	        iis.close();

	        // Return the format name
	        return reader.getFormatName();
	    } catch (IOException e) {
	    }
	    // The image could not be read
	    return null;
	}

	
	public static void main(String[] args){
		reduceImg("d:/test.jpg", 600,true);
	}
	

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用方法:调用onload=AutoResizeImage()即可: <img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(300,600,this)" /> 注意设置width="0" height="0" 也可onload="AutoResizeImage(0,250,this)"或onload="AutoResizeImage(250,0,this)" ,注意体会。 以下为使用示例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>最新javascript自动按比例显示图片,按比例压缩图片显示</title> <script language="javascript" src="./resizepic.js"></script> </head> <body> <br /> 原图显示(534 X 800)<br /> onload="AutoResizeImage(0,0,this)<br /> <a href="./sample_pic.jpg" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(0,0,this)" alt="534 X 800"/></a><br/><br /> 1.按宽度250压缩,不限制高度 按比例压缩<br /> onload="AutoResizeImage(250,0,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(250,0,this)" alt="250 X 374"/></a><br /><br /> 2.按高度250压缩,不限制宽度 按比例压缩<br /> onload="AutoResizeImage(0,250,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(0,250,this)" alt="166 X 250"/></a><br /><br /> 3.按高度250宽度250 按比例压缩<br /> onload="AutoResizeImage(250,250,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(250,250,this)" alt="200 X 300"/></a><br /><br /> 4.高宽不等比例压缩 (400 X 512),此时高度不变,会自动按高度的比例压缩。<br /> onload="AutoResizeImage(400,512,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(400,512,this)" alt="341 X 512"/></a><br /><br /> 5.高宽不等比例压缩 (300 X 600),此时宽度不变,会自动按宽度的比例压缩。<br /> onload="AutoResizeImage(300,600,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="./sample_pic.jpg" border="0" width="0" height="0" onload="AutoResizeImage(300,600,this)" alt="300 X 449"/></a><br /><br /> 6.如果图片本来的高度和宽度小于压缩的最大高度和宽度,则不会拉大显示图片(按原图显示)<br /> 原图444 x 207,压缩为 500 x 600,将保持原图显示<br /> onload="AutoResizeImage(500,600,this)"<br /> <a href="http://www.toyi.cc" target="_blank"><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/feng_sundy/242776/o_20070410_b7409cd284a0f799a357uePcEFa6ty0X.jpg" border="0" width="0" height="0" onload="AutoResizeImage(500,600,this)" alt="444 X 207"/></a><br /><br /> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值