服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|JavaScript|

服务器之家 - 编程语言 - JAVA教程 - Java基于装饰者模式实现的图片工具类实例【附demo源码下载】

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

2020-12-28 09:46qq_35433926 JAVA教程

这篇文章主要介绍了Java基于装饰者模式实现的图片工具类,结合完整实例形式分析了装饰者模式实现图片的判断、水印、缩放、复制等功能,并附带demo源码供读者下载参考,需要的朋友可以参考下

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

ImgUtil.java:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * 装饰者模式实现图片处理工具类
 * 类似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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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(), waterImg, f.getParent(), 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, String waterImg, 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 waterImg, 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, 0, 0, width, height, 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, x, y, 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, String waterImg, String target, 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, 0, 0, width, height, 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 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, 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();
    }
  }
}

Resize.java:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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(), f.getParent(), ratio, bb);
      }
    } else if (height>0 && width>0) {
      for (File f: src) {
        resize(f.getPath(), f.getParent(), height, width, 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, String target, int height, int width, boolean bb) {
    File newFile = null;
    try {
      double ratio = 0; //缩放比例
      File f = new File(src);
      BufferedImage bi = ImageIO.read(f);
      Image itemp = bi.getScaledInstance(width, height, 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, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        if (width == itemp.getWidth(null))
          g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), color, null);
        else
          g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), color, 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, "jpg", newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
  /** 图片缩放-按照高宽比 */
  private static void resize(String src, String target, double ratio, 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, height, BufferedImage.SCALE_SMOOTH);
      AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(1, 1), null);
      itemp = op.filter(bi, null);
      if (bb) {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        if (width == itemp.getWidth(null))
          g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), color, null);
        else
          g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), color, 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, "jpg", newFile);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Img.java:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
 * 图片 - 原组件
 * @author xlk
 */
public class Img implements ImgUtil {
  private  String  src;  //源图片或图片文件夹路径
  private  String  target;  //目标文件夹路径
  private  boolean  inner;  //true-包含子文件夹, false-仅当前文件夹
  @Override
  public List<File> dispose() {
    return copy();
  }
  /** 复制 - 被装饰者初始状态 */
  private List<File> copy() {
    if (src==null || "".equals(src) || target==null || "".equals(target)) {
      throw new RuntimeException("源路径或目标路径不能为空");
    }
    File srcFile = new File(src);
    List<File> list = new ArrayList<File>();
    
    File targetDir = new File(target);
    if (!targetDir.exists()) {
      targetDir.mkdirs();
    }
    a:
    if (srcFile.isDirectory()) {//源路径是文件夹
      File[] subs = srcFile.listFiles();
      if (subs.length<=0) {
        break a;
      }
      for (File sub: subs) {
        if (sub.isDirectory() && inner) {
          list.addAll(new Img(sub.getPath(), target+File.separator+sub.getName(), true).copy());
        } else if (AbstractImgUtil.isImg(sub)) {
          list.add(copy(sub, target));
        }
      }
    } else if (AbstractImgUtil.isImg(srcFile)) {//源路径是图片
      list.add(copy(srcFile, target));
    }
    return list;
  }
  private File copy(File file, String target) {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    File newFile = null;
    try {
      fis = new FileInputStream(file);
      newFile = new File(target + File.separator + file.getName());
      fos = new FileOutputStream(newFile);
      byte[] bs = new byte[1024*10];
      int len = -1;
      while ((len=fis.read(bs))!=-1) {
        fos.write(bs, 0, len);
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (fis!=null) {
          fis.close();
        }
        if (fos!=null) {
          fos.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    return newFile;
  }
  public Img() {}
  public Img(String src, String target) {
    this.src = src;
    this.target = target;
  }
  public Img(String src, String target, boolean inner) {
    this.src = src;
    this.target = target;
    this.inner = inner;
  }
  public String getSrc() {
    return src;
  }
  public void setSrc(String src) {
    this.src = src;
  }
  public String getTarget() {
    return target;
  }
  public void setTarget(String target) {
    this.target = target;
  }
  public boolean isInner() {
    return inner;
  }
  public void setInner(boolean inner) {
    this.inner = inner;
  }
}

附:完整实例代码点击此处本站下载

希望本文所述对大家java程序设计有所帮助。

原文链接:http://download.csdn.net/download/qq_35433926/9734559

延伸 · 阅读

精彩推荐