加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

发布时间:2020-05-23 06:14:16 所属栏目:Java 来源:互联网
导读:本文实例讲述了Java基于装饰者模式实现的图片工具类。分享给大家供大家参考,具体如下:

本文实例讲述了Java基于装饰者模式实现的图片工具类。分享给大家供大家参考,具体如下:

ImgUtil.java:

/*
 * 装饰者模式实现图片处理工具类
 * 类似java的io流 - 
 * Img类似低级流可以独立使用
 * Press和Resize类似高级流
 * 需要依赖于低级流
 */
package util;
import java.io.File;
import java.util.List;
/**
 * 图片工具类(装饰者)和图片(被装饰者)的公共接口
 * @author xlk
 */
public interface ImgUtil {
  /** 装饰方法 - 处理图片 */
  List<File> dispose();
}

AbstractImgUtil.java:

package util;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/**
 * 抽象图片工具类 - 抽象装饰者
 * @author xlk
 */
public abstract class AbstractImgUtil implements ImgUtil {
  private ImgUtil imgUtil;
  @Override
  public List<File> dispose() {
    return imgUtil.dispose();
  }
  public AbstractImgUtil(){}
  public AbstractImgUtil(ImgUtil imgUtil) {
    this.imgUtil = imgUtil;
  }
  /**
   * 判断文件是不是图片
   * @param file 被判断的文件
   * @return 图片返回true 非图片返回false
   * @throws IOException 
   */
  public static boolean isImg(File file) {
    if (file.isDirectory()) {
      return false;
    }
    try {
      ImageInputStream iis = ImageIO.createImageInputStream(file);
      Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
      if (!iter.hasNext()) {//文件不是图片
        return false;
      }
      return true;
    } catch (IOException e) {
      return false;
    }
  }
}

Press.java:

package util;
import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
/**
 * 加水印 - 装饰者
 * @author xlk
 */
public class Press extends AbstractImgUtil {
  private  List<File>  src;   //图片路径集合
  private  String    waterImg;//水印图片路径
  private  Integer    x;     //水印图片距离目标图片左侧的偏移量,如果x<0,则在正中间
  private  Integer    y;     //水印图片距离目标图片上侧的偏移量,如果y<0,则在正中间
  private  float    alpha;   //水印透明度(0.0 -- 1.0,0.0为完全透明,1.0为完全不透明)
  @Override
  public List<File> dispose() {
    src = super.dispose();
    return press();
  }
  /** 加水印 - 具体装饰方法 */
  private List<File> press() {
    if (waterImg==null || "".equals(waterImg)) {
      throw new RuntimeException("水印路径不能为空");
    }
    if (!isImg(new File(waterImg))) {
      throw new RuntimeException("水印路径所指向的文件不是图片");
    }
    if (src.size()<=0) {
      return src;
    }
    if (x!=null && y!=null) {
      for (File f: src) {
        press(f.getPath(),waterImg,f.getParent(),x,y,alpha);
      }
    } else {
      for (File f: src) {
        press(f.getPath(),alpha);
      }
    }
    return src;
  }
  public Press() {}
  public Press(ImgUtil imgUtil,String waterImg,float alpha) {
    super(imgUtil);
    this.waterImg = waterImg;
    this.alpha = alpha;
  }
  public Press(ImgUtil imgUtil,Integer x,Integer y,float alpha) {
    super(imgUtil);
    this.waterImg = waterImg;
    this.x = x;
    this.y = y;
    this.alpha = alpha;
  }
  public String getWaterImg() {
    return waterImg;
  }
  public void setWaterImg(String waterImg) {
    this.waterImg = waterImg;
  }
  public Integer getX() {
    return x;
  }
  public void setX(Integer x) {
    this.x = x;
  }
  public Integer getY() {
    return y;
  }
  public void setY(Integer y) {
    this.y = y;
  }
  public float getAlpha() {
    return alpha;
  }
  public void setAlpha(float alpha) {
    this.alpha = alpha;
  }
  /** 添加图片水印 */
  private static void press(String src,String target,int x,int y,float alpha) {
    File newFile = null;
    try {
      File file = new File(src);
      Image image = ImageIO.read(file);
      int width = image.getWidth(null);
      int height = image.getHeight(null);
      BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
      Graphics2D g = bufferedImage.createGraphics();
      g.drawImage(image,width,null);
      
      Image waterImage = ImageIO.read(new File(waterImg)); // 水印文件
      int width_1 = waterImage.getWidth(null);
      int height_1 = waterImage.getHeight(null);
      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
      
      int widthDiff = width - width_1;
      int heightDiff = height - height_1;
      if (x < 0) {
        x = widthDiff / 2;
      } else if (x > widthDiff) {
        x = widthDiff;
      }
      if (y < 0) {
        y = heightDiff / 2;
      } else if (y > heightDiff) {
        y = heightDiff;
      }
      g.drawImage(waterImage,width_1,height_1,null); // 水印文件结束
      g.dispose();
      
      File dir = new File(target);
      if (!dir.exists()) {
        dir.mkdirs();
      }
      newFile = new File(target + File.separator + file.getName());
      ImageIO.write(bufferedImage,"jpg",newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /** 平铺添加图片水印 */
  private static void press(String src,alpha));
      
      int rpt_x = width>width_1?(int)Math.ceil(Double.valueOf(width)/width_1):1;//x方向重复次数
      int rpt_y = height>height_1?(int)Math.ceil(Double.valueOf(height)/height_1):1;//y方向重复次数
      for (int i=0; i<rpt_x; i++) {
        for (int j=0; j<rpt_y; j++) {
          g.drawImage(waterImage,i*width_1,j*height_1,null);
        }
      }// 水印文件结束
      g.dispose();
      
      File dir = new File(target);
      if (!dir.exists()) {
        dir.mkdirs();
      }
      newFile = new File(target + File.separator + file.getName());
      ImageIO.write(bufferedImage,newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Resize.java:

package util;
import java.awt.Color;
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 java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
/**
 * 缩放 - 装饰者
 * @author xlk
 */
public class Resize extends AbstractImgUtil {
  /** 比例不同边界颜色 */
  private static final Color color = new Color(230,230,230);
  private  List<File>  src;  //图片路径集合
  private  int      height;  //处理后高度
  private int      width;  //处理后宽度
  private double    ratio;  //处理后高宽比
  private boolean    bb;    //比例不对时是否补白
  @Override
  public List<File> dispose() {
    src = super.dispose();
    return resize();
  }
  /** 缩放 - 具体装饰方法 */
  private List<File> resize() {
    if (src.size()<=0) {
      return src;
    }
    if (ratio>0) {
      for (File f: src) {
        resize(f.getPath(),ratio,bb);
      }
    } else if (height>0 && width>0) {
      for (File f: src) {
        resize(f.getPath(),bb);
      }
    }
    return src;
  }
  public Resize() {}
  public Resize(ImgUtil imgUtil,int height,int width,boolean bb) {
    super(imgUtil);
    this.height = height;
    this.width = width;
    this.bb = bb;
  }
  public Resize(ImgUtil imgUtil,double ratio,boolean bb) {
    super(imgUtil);
    this.ratio = ratio;
    this.bb = bb;
  }
  public int getHeight() {
    return height;
  }
  public void setHeight(int height) {
    this.height = height;
  }
  public int getWidth() {
    return width;
  }
  public void setWidth(int width) {
    this.width = width;
  }
  public double getRatio() {
    return ratio;
  }
  public void setRatio(double ratio) {
    this.ratio = ratio;
  }
  public boolean isBb() {
    return bb;
  }
  public void setBb(boolean bb) {
    this.bb = bb;
  }
  /** 图片缩放-按照尺寸 */
  private static void resize(String src,boolean bb) {
    File newFile = null;
    try {
      double ratio = 0; //缩放比例
      File f = new File(src);
      BufferedImage bi = ImageIO.read(f);
      Image itemp = bi.getScaledInstance(width,BufferedImage.SCALE_SMOOTH);
      //计算比例
      if (Double.valueOf(bi.getHeight())/bi.getWidth() > Double.valueOf(height)/width) {
        ratio = Double.valueOf(height) / bi.getHeight();
      } else {
        ratio = Double.valueOf(width) / bi.getWidth();
      }
      AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio,ratio),null);
      itemp = op.filter(bi,null);
      if (bb) {
        BufferedImage image = new BufferedImage(width,BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor(color);
        g.fillRect(0,height);
        if (width == itemp.getWidth(null))
          g.drawImage(itemp,(height - itemp.getHeight(null)) / 2,itemp.getWidth(null),itemp.getHeight(null),color,null);
        else
          g.drawImage(itemp,(width - itemp.getWidth(null)) / 2,null);
        g.dispose();
        itemp = image;
      }
      
      File dir = new File(target);
      if (!dir.exists()) {
        dir.mkdirs();
      }
      newFile = new File(target + File.separator + f.getName());
      ImageIO.write((BufferedImage) itemp,newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /** 图片缩放-按照高宽比 */
  private static void resize(String src,boolean bb) {
    File newFile = null;
    try {
      File f = new File(src);
      BufferedImage bi = ImageIO.read(f);
      //计算尺寸
      int width = bi.getWidth();
      int height = bi.getHeight();
      if (Double.valueOf(height)/width<ratio) {
        height = (int)(width*ratio);
      } else {
        width = (int)(Double.valueOf(height)/ratio);
      }
      Image itemp = bi.getScaledInstance(width,BufferedImage.SCALE_SMOOTH);
      AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(1,1),newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读