[]java 图片剪裁和缩放

package com.example.xmhi;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

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


/**
 * 图片裁剪的测试类
 * @author Administrator
 *
 */
public class TestCutImg {
    private static String imgPath = "F:\\ohergal\\My Pictures\\时尚先生";    //文件路径
   
    private static String imgName = "2007_11_20_14_04_27_66762_0_2.jpg";    //文件名
   
    private static String outPath = "D:\\";    //输出路径
   
    private static String outName = "test.jpg";    //输出文件名
   
   
    /**
     * 图片裁剪
     */
    public void cut(){
         try {
            //获取源图片
            FileInputStream is = new  FileInputStream(imgPath+File.separator+imgName);
            /*
             * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader
             * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
             * 例如 "jpeg" 或 "tiff"等 。
             */
            Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
            ImageReader reader = it.next();
            ImageInputStream iis = ImageIO.createImageInputStream(is);
            /*
             * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
             * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader
             *  避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
             */
             reader.setInput(iis,true) ;
             /*
             * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
             * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件
             * 将从其 ImageReader 实现的 getDefaultReadParam 方法中返回
             * ImageReadParam 的实例。  
             */
             ImageReadParam param = reader.getDefaultReadParam();
             
             Rectangle rect = new Rectangle(160, 100, 400, 481);
             //提供一个 BufferedImage,将其用作解码像素数据的目标。
             param.setSourceRegion(rect);
             /*
              * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
              * 它作为一个完整的 BufferedImage 返回。
              */
             BufferedImage bi = reader.read(0,param);                
       
             //保存新图片
             ImageIO.write(bi, "jpg", new File(outPath+File.separator+outName));    
        } catch (FileNotFoundException e) {
            System.out.println("找不到图片: "+imgPath+File.separator+imgName);
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("获取图片输入流错误 :"+imgPath+File.separator+imgName);
            e.printStackTrace();
        }
    }
   
    /**
     * 图片缩放测试
     */
    public void reSize(){
        try {
            // 读入文件
            BufferedImage src = ImageIO.read(new File(imgPath+File.separator+imgName));
            int width = src.getWidth()/2; // 得到源图宽
            int height = src.getHeight()/2; // 得到源图长
            Image image = src.getScaledInstance(width, height, Image.SCALE_DEFAULT);
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
            g.dispose();
            ImageIO.write(tag, "JPEG", new File(outPath+File.separator+outName));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args){
        TestCutImg tci = new TestCutImg();
        //tci.cut();
        tci.reSize();
    }
}

 

转载自: http://www.throughsoul.com/archives/682.html

你可能感兴趣的:(java)