您好,登錄后才能下訂單哦!
本文實(shí)例講述了Java基于裝飾者模式實(shí)現(xiàn)的圖片工具類。分享給大家供大家參考,具體如下:
ImgUtil.java:
/* * 裝飾者模式實(shí)現(xiàn)圖片處理工具類 * 類似java的io流 - * Img類似低級(jí)流可以獨(dú)立使用 * Press和Resize類似高級(jí)流 * 需要依賴于低級(jí)流 */ 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; //水印圖片距離目標(biāo)圖片左側(cè)的偏移量, 如果x<0, 則在正中間 private Integer y; //水印圖片距離目標(biāo)圖片上側(cè)的偏移量, 如果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); // 水印文件結(jié)束 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方向重復(fù)次數(shù) int rpt_y = height>height_1?(int)Math.ceil(Double.valueOf(height)/height_1):1;//y方向重復(fù)次數(shù) 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); } }// 水印文件結(jié)束 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:
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; //比例不對(duì)時(shí)是否補(bǔ)白 @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); //計(jì)算比例 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); //計(jì)算尺寸 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:
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; //目標(biāo)文件夾路徑 private boolean inner; //true-包含子文件夾, false-僅當(dāng)前文件夾 @Override public List<File> dispose() { return copy(); } /** 復(fù)制 - 被裝飾者初始狀態(tài) */ private List<File> copy() { if (src==null || "".equals(src) || target==null || "".equals(target)) { throw new RuntimeException("源路徑或目標(biāo)路徑不能為空"); } 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; } }
附:完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。