资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

利用java如何实现一个图片缩放效果

这篇文章主要介绍了利用java如何实现一个图片缩放效果,创新互联小编觉得不错,现在分享给大家,也给大家做个参考,一起跟随创新互联小编来看看吧!

站在用户的角度思考问题,与客户深入沟通,找到霍林郭勒网站设计与霍林郭勒网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名注册、网页空间、企业邮箱。业务覆盖霍林郭勒地区。

Java是什么

Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。

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);*/
  }

}

以上就是创新互联小编为大家收集整理的利用java如何实现一个图片缩放效果,如何觉得创新互联网站的内容还不错,欢迎将创新互联网站推荐给身边好友。


分享名称:利用java如何实现一个图片缩放效果
文章分享:http://cdkjz.cn/article/jddjjo.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220