图片定位截取

package com.jiwu.utils;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import com.jiwu.common.Constants;

/** 
 * 
 *
 *  @author  xjl
 * 
 *
 *
 */
public class OperateImage {

 // ===源图片路径名称如:c:\1.jpg   
 private String srcpath;

 // ===剪切图片存放路径名称.如:c:\2.jpg  
 private String subpath;

 // ===剪切点x坐标  
 private int x;

 private int y;

 // ===剪切点宽度  
 private int width;

 private int height;

 public OperateImage() {

 }

 public OperateImage(int x, int y, int width, int height) {
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
 }

 /**  
  * 对图片裁剪,并把裁剪完蛋新图片保存 。
  */
 public void cut() throws IOException {
  FileInputStream is = null;
  ImageInputStream iis = null;
  File file=null;
  try {
   if(srcpath.indexOf(".jiwu.com")>1){//判断是不是网络文件
     URL url = new URL(srcpath); 
     BufferedInputStream  in = new BufferedInputStream(url.openStream(),3024); 
     file=new File(url.getFile());
     srcpath = Constants.ADMIN_BUILDJS+"images/tmp/subject_"+file.getName();
     File folder = new File(srcpath.substring(0, srcpath.lastIndexOf("/")));
     if(!folder.exists()){
        folder.mkdirs();
        }
     File img = new File(srcpath);  
              BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(img),3024);  
   
                 byte [] buffer = new byte [3024];
                 int bytesRead = 0;
                 while ((bytesRead = in.read(buffer, 0, 3024)) != -1)  {
                     out.write(buffer, 0, bytesRead);
                 }
               if(null != in)  {
                in.close();
               }if(null != out)  {
                out.close();
               }
   }
   // 读取图片文件  
   is = new FileInputStream(new File(srcpath));
   /* 
    * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 
    * 声称能够解码指定格式。 参数:formatName - 包含非正式格式名称 .
    *(例如 "jpeg" 或 "tiff")等 。 
    */
   Iterator<ImageReader> it = ImageIO
     .getImageReadersByFormatName("jpg");
   ImageReader reader = it.next();
   // 获取图片流   
   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 指定了坐标空间中的一个区域,通过 Rectangle 对象
    * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。 
    */
   Rectangle rect = new Rectangle(x, y, width, height);

   // 提供一个 BufferedImage,将其用作解码像素数据的目标。   
   param.setSourceRegion(rect);

   /* 
    * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将
    * 它作为一个完整的 BufferedImage 返回。
    */
   BufferedImage bi = reader.read(0, param);

   // 保存新图片   
   ImageIO.write(bi, "jpg", new File(subpath));
  } finally {
   if (is != null)
    is.close();
   if (iis != null)
    iis.close();
  }

 }

 public int getHeight() {
  return height;
 }

 public void setHeight(int height) {
  this.height = height;
 }

 public String getSrcpath() {
  return srcpath;
 }

 public void setSrcpath(String srcpath) {
  this.srcpath = srcpath;
 }

 public String getSubpath() {
  return subpath;
 }

 public void setSubpath(String subpath) {
  this.subpath = subpath;
 }

 public int getWidth() {
  return width;
 }

 public void setWidth(int width) {
  this.width = width;
 }

 public int getX() {
  return x;
 }

 public void setX(int x) {
  this.x = x;
 }

 public int getY() {
  return y;
 }

 public void setY(int y) {
  this.y = y;
 }

 public static void main(String[] args) throws Exception {

  String name = "D:\\2679321.jpg";

  OperateImage o = new OperateImage(145, 178, 145, 124);
  o.setSrcpath(name);
  o.setSubpath("D:\\1.jpg ");
  o.cut();

 }
 
}

猜你喜欢

转载自xjl712.iteye.com/blog/1852914
今日推荐