欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java实现图片缩放、旋转和马赛克化

程序员文章站 2023-11-06 12:11:04
本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。 不多说,上代码: package deal; import jav...

本文是作者结合网上的一些资料封装的java图片处理类,支持图片的缩放,旋转,马赛克化。

不多说,上代码:

package deal;

import java.awt.color;
import java.awt.graphics;
import java.awt.graphics2d;
import java.awt.image;
import java.awt.geom.affinetransform;
import java.awt.image.affinetransformop;
import java.awt.image.bufferedimage;
import java.io.file;

import javax.imageio.imageio;

/**
 * 图像处理类.
 * 
 * @author nagsh
 * 
 */
public class imagedeal {

  string openurl; // 原始图片打开路径
  string saveurl; // 新图保存路径
  string savename; // 新图名称
  string suffix; // 新图类型 只支持gif,jpg,png

  public imagedeal(string openurl, string saveurl, string savename,
      string suffix) {
    this.openurl = openurl;
    this.savename = savename;
    this.saveurl = saveurl;
    this.suffix = suffix;
  }

  /**
   * 图片缩放.
   * 
   * @param width
   *      需要的宽度
   * @param height
   *      需要的高度
   * @throws exception
   */
  public void zoom(int width, int height) throws exception {
    double sx = 0.0;
    double sy = 0.0;

    file file = new file(openurl);
    if (!file.isfile()) {
      throw new exception("imagedeal>>>" + file + " 不是一个图片文件!");
    }
    bufferedimage bi = imageio.read(file); // 读取该图片
    // 计算x轴y轴缩放比例--如需等比例缩放,在调用之前确保参数width和height是等比例变化的
    sx = (double) width / bi.getwidth();
    sy = (double) height / bi.getheight();

    affinetransformop op = new affinetransformop(
        affinetransform.getscaleinstance(sx, sy), null);
    file sf = new file(saveurl, savename + "." + suffix);
    image zoomimage = op.filter(bi, null);
    try {
      imageio.write((bufferedimage) zoomimage, suffix, sf); // 保存图片
    } catch (exception e) {
      e.printstacktrace();
    }

  }

  /**
   * 旋转
   * 
   * @param degree
   *      旋转角度
   * @throws exception
   */
  public void spin(int degree) throws exception {
    int swidth = 0; // 旋转后的宽度
    int sheight = 0; // 旋转后的高度
    int x; // 原点横坐标
    int y; // 原点纵坐标

    file file = new file(openurl);
    if (!file.isfile()) {
      throw new exception("imagedeal>>>" + file + " 不是一个图片文件!");
    }
    bufferedimage bi = imageio.read(file); // 读取该图片
    // 处理角度--确定旋转弧度
    degree = degree % 360;
    if (degree < 0)
      degree = 360 + degree;// 将角度转换到0-360度之间
    double theta = math.toradians(degree);// 将角度转为弧度

    // 确定旋转后的宽和高
    if (degree == 180 || degree == 0 || degree == 360) {
      swidth = bi.getwidth();
      sheight = bi.getheight();
    } else if (degree == 90 || degree == 270) {
      sheight = bi.getwidth();
      swidth = bi.getheight();
    } else {
      swidth = (int) (math.sqrt(bi.getwidth() * bi.getwidth()
          + bi.getheight() * bi.getheight()));
      sheight = (int) (math.sqrt(bi.getwidth() * bi.getwidth()
          + bi.getheight() * bi.getheight()));
    }

    x = (swidth / 2) - (bi.getwidth() / 2);// 确定原点坐标
    y = (sheight / 2) - (bi.getheight() / 2);

    bufferedimage spinimage = new bufferedimage(swidth, sheight,
        bi.gettype());
    // 设置图片背景颜色
    graphics2d gs = (graphics2d) spinimage.getgraphics();
    gs.setcolor(color.white);
    gs.fillrect(0, 0, swidth, sheight);// 以给定颜色绘制旋转后图片的背景

    affinetransform at = new affinetransform();
    at.rotate(theta, swidth / 2, sheight / 2);// 旋转图象
    at.translate(x, y);
    affinetransformop op = new affinetransformop(at,
        affinetransformop.type_bicubic);
    spinimage = op.filter(bi, spinimage);
    file sf = new file(saveurl, savename + "." + suffix);
    imageio.write(spinimage, suffix, sf); // 保存图片

  }
  /**
   * 马赛克化.
   * @param size 马赛克尺寸,即每个矩形的长宽
   * @return
   * @throws exception
   */
  public boolean mosaic(int size) throws exception {
    file file = new file(openurl);
    if (!file.isfile()) {
      throw new exception("imagedeal>>>" + file + " 不是一个图片文件!");
    }
    bufferedimage bi = imageio.read(file); // 读取该图片
    bufferedimage spinimage = new bufferedimage(bi.getwidth(),
        bi.getheight(), bi.type_int_rgb);
    if (bi.getwidth() < size || bi.getheight() < size || size <= 0) { // 马赛克格尺寸太大或太小
      return false;
    }

    int xcount = 0; // 方向绘制个数
    int ycount = 0; // y方向绘制个数
    if (bi.getwidth() % size == 0) {
      xcount = bi.getwidth() / size;
    } else {
      xcount = bi.getwidth() / size + 1;
    }
    if (bi.getheight() % size == 0) {
      ycount = bi.getheight() / size;
    } else {
      ycount = bi.getheight() / size + 1;
    }
    int x = 0;  //坐标
    int y = 0;
    // 绘制马赛克(绘制矩形并填充颜色)
    graphics gs = spinimage.getgraphics();
    for (int i = 0; i < xcount; i++) {
      for (int j = 0; j < ycount; j++) {
        //马赛克矩形格大小
         int mwidth = size;
         int mheight = size;
         if(i==xcount-1){  //横向最后一个比较特殊,可能不够一个size
           mwidth = bi.getwidth()-x;
         }
         if(j == ycount-1){ //同理
           mheight =bi.getheight()-y;
         }
       // 矩形颜色取中心像素点rgb值
        int centerx = x;
        int centery = y;
        if (mwidth % 2 == 0) {
          centerx += mwidth / 2;
        } else {
          centerx += (mwidth - 1) / 2;
        }
        if (mheight % 2 == 0) {
          centery += mheight / 2;
        } else {
          centery += (mheight - 1) / 2;
        }
        color color = new color(bi.getrgb(centerx, centery));
        gs.setcolor(color);
        gs.fillrect(x, y, mwidth, mheight);
        y = y + size;// 计算下一个矩形的y坐标
      }
      y = 0;// 还原y坐标
      x = x + size;// 计算x坐标
    }
    gs.dispose();
    file sf = new file(saveurl, savename + "." + suffix);
    imageio.write(spinimage, suffix, sf); // 保存图片
    return true;
  }

  public static void main(string[] args) throws exception {
    imagedeal imagedeal = new imagedeal("e://1.jpg", "e://", "2", "jpg");
    // 测试缩放
    /* imagedeal.zoom(200, 300); */
    // 测试旋转
    /* imagedeal.spin(90); */
    //测试马赛克
    /*imagedeal.mosaic(4);*/
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。