2007-10-24

java图像处理(切分)

关键字: 图像处理


package com.caicai.photo;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.Graphics;
import java.awt.color.ColorSpace;
import javax.imageio.ImageIO;

public class ImageCut {


  /**
   * 缩放图像
   *
   * @param srcImageFile
   *            源图像文件地址
   * @param result
   *            缩放后的图像地址
   * @param scale
   *            缩放比例
   * @param flag
   *            缩放选择:true 放大; false 缩小;
   */
  public static void scale(String srcImageFile, String result, int scale,
    boolean flag) {
   try {
    BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
    int width = src.getWidth(); // 得到源图宽
    int height = src.getHeight(); // 得到源图长
    if (flag) {
     // 放大
     width = width * scale;
     height = height * scale;
    } else {
     // 缩小
     width = width / scale;
     height = height / scale;
    }
    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(result));// 输出到文件流
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  /**
   * 图像切割
   *
   * @param srcImageFile
   *            源图像地址
   * @param descDir
   *            切片目标文件夹
   * @param destWidth
   *            目标切片宽度
   * @param destHeight
   *            目标切片高度
   */
  public static void cut(String srcImageFile, String descDir, int destWidth,
    int destHeight) {
   try {
    Image img;
    ImageFilter cropFilter;
    // 读取源图像
    BufferedImage bi = ImageIO.read(new File(srcImageFile));
    int srcWidth = bi.getHeight(); // 源图宽度
    int srcHeight = bi.getWidth(); // 源图高度
    Image image = bi.getScaledInstance(srcWidth, srcHeight,
        Image.SCALE_DEFAULT);

    if (srcWidth > destWidth && srcHeight > destHeight) {    
     //destWidth = 200; // 切片宽度
     //destHeight = 150; // 切片高度
     int cols = 0; // 切片横向数量
     int rows = 0; // 切片纵向数量
     // 计算切片的横向和纵向数量
     if (srcWidth % destWidth == 0) {
      cols = srcWidth / destWidth;
     } else {
      cols = (int) Math.floor(srcWidth / destWidth) + 1;
     }
     if (srcHeight % destHeight == 0) {
      rows = srcHeight / destHeight;
     } else {
      rows = (int) Math.floor(srcHeight / destHeight) + 1;
     }
     // 循环建立切片
     // 改进的想法:是否可用多线程加快切割速度
     for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
       // 四个参数分别为图像起点坐标和宽高
       // 即: CropImageFilter(int x,int y,int width,int height)
       cropFilter = new CropImageFilter(j * destWidth, i * destHeight,
         Math.min(destWidth,srcWidth - j * destWidth), Math.min(srcHeight - i * destHeight,destHeight));
       img = Toolkit.getDefaultToolkit().createImage(
         new FilteredImageSource(image.getSource(),
           cropFilter));
       BufferedImage tag = new BufferedImage(Math.min(destWidth,srcWidth - j * destWidth),
         Math.min(srcHeight - i * destHeight,destHeight), BufferedImage.TYPE_INT_RGB);
       Graphics g = tag.getGraphics();
       g.drawImage(img, 0, 0, null); // 绘制缩小后的图
       g.dispose();
       // 输出为文件
       ImageIO.write(tag, "JPEG", new File(descDir
         + "pre_map_" + i + "_" + j + ".jpg"));
      }
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  /**
   * 图像类型转换
      * GIF->JPG GIF->PNG PNG->JPG PNG->GIF(X)
      */
  public static void convert(String source, String result) {
   try {
    File f = new File(source);
    f.canRead();
    f.canWrite();
    BufferedImage src = ImageIO.read(f);
    ImageIO.write(src, "JPG", new File(result));
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  /**
   * 彩色转为黑白
   *
   * @param source
   * @param result
   */
  public static void gray(String source, String result) {
   try {
    BufferedImage src = ImageIO.read(new File(source));
    ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
    ColorConvertOp op = new ColorConvertOp(cs, null);
    src = op.filter(src, null);
    ImageIO.write(src, "JPEG", new File(result));
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  /**
   * @param args
   */
  public static void main(String[] args) {
   cut("f:\\IMG_0101.jpg", "f:\\t\\", 300, 300);
  }
 


}

评论
wuwei_725 2008-04-30   回复
因为要抓取其他网站上的新闻,需要破解验证码实现程序方式地登录,所以对破解验证码研究了一下,大部份的实现逻辑都是先按固定大小将图片切割……,对java的图片处理一点也不了解,在网上找了不少文章,卡在了切割图片这个点上,看到了上面写的方法,就直接拿来用了,可以切割,但不符合要求。然来是
    int srcWidth = bi.getHeight(); // 源图宽度
    int srcHeight = bi.getWidth(); // 源图高度
这块刚好写反了,不知是楼主不小心写错了呢,还是“以讹传讹”。不管怎样,谢过了,
发表评论

您还没有登录,请登录后发表评论

cris_jxg
搜索本博客
博客分类
存档
最新评论