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

网友投稿 279 2023-04-08


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

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

ImgUtil.java:

/*

* 装饰者模式实现图片处理工具类

* 类似java的io流 -

* Img类似低级流可以独立使用

* Press和Resize类似高级流

* 需要依赖于低级流

*/

package util;

import java.io.File;

import java.util.List;

/**

* 图片工具类(装饰者)和图片(被装饰者)的公共接口

* @author xlk

*/

public interface ImgUtil {

/** 装饰方法 - 处理图片 */

List 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 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 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 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 dispose() {

src = super.dispose();

return press();

}

/** 加水印 - 具体装饰方法 */

private List 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

for (int j=0; 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:

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 src; //图片路径集合

private int height; //处理后高度

private int width; //处理后宽度

private double ratio; //处理后高宽比

private boolean bb; //比例不对时是否补白

@Override

public List dispose() {

src = super.dispose();

return resize();

}

/** 缩放 - 具体装饰方法 */

private List resize() {

if (src.size()<=0) {

return src;

}

if (ratio>0) {

for (File f: src) {

resize(f.getPath(), f.getParent(), ratio, bb);

}

} else if (hehttp://ight>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

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; //目标文件夹路径

private boolean inner; //true-包含子文件夹, false-仅当前文件夹

@Override

public List dispose() {

return copy();

}

/** 复制 - 被装饰者初始状态 */

private List copy() {

if (src==null || "".equals(src) || target==null || "".equals(target)) {

throw new RuntimeException("源路径或目标路径不能为空");

}

File srcFile = new File(src);

List list = new ArrayList();

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 innCMlCPxPPer) {

this.inner = inner;

}

}

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

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

for (int j=0; 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:

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 src; //图片路径集合

private int height; //处理后高度

private int width; //处理后宽度

private double ratio; //处理后高宽比

private boolean bb; //比例不对时是否补白

@Override

public List dispose() {

src = super.dispose();

return resize();

}

/** 缩放 - 具体装饰方法 */

private List resize() {

if (src.size()<=0) {

return src;

}

if (ratio>0) {

for (File f: src) {

resize(f.getPath(), f.getParent(), ratio, bb);

}

} else if (hehttp://ight>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

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; //目标文件夹路径

private boolean inner; //true-包含子文件夹, false-仅当前文件夹

@Override

public List dispose() {

return copy();

}

/** 复制 - 被装饰者初始状态 */

private List copy() {

if (src==null || "".equals(src) || target==null || "".equals(target)) {

throw new RuntimeException("源路径或目标路径不能为空");

}

File srcFile = new File(src);

List list = new ArrayList();

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 innCMlCPxPPer) {

this.inner = inner;

}

}

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

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

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:

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 src; //图片路径集合

private int height; //处理后高度

private int width; //处理后宽度

private double ratio; //处理后高宽比

private boolean bb; //比例不对时是否补白

@Override

public List dispose() {

src = super.dispose();

return resize();

}

/** 缩放 - 具体装饰方法 */

private List resize() {

if (src.size()<=0) {

return src;

}

if (ratio>0) {

for (File f: src) {

resize(f.getPath(), f.getParent(), ratio, bb);

}

} else if (hehttp://ight>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

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; //目标文件夹路径

private boolean inner; //true-包含子文件夹, false-仅当前文件夹

@Override

public List dispose() {

return copy();

}

/** 复制 - 被装饰者初始状态 */

private List copy() {

if (src==null || "".equals(src) || target==null || "".equals(target)) {

throw new RuntimeException("源路径或目标路径不能为空");

}

File srcFile = new File(src);

List list = new ArrayList();

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 innCMlCPxPPer) {

this.inner = inner;

}

}

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

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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

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; //目标文件夹路径

private boolean inner; //true-包含子文件夹, false-仅当前文件夹

@Override

public List dispose() {

return copy();

}

/** 复制 - 被装饰者初始状态 */

private List copy() {

if (src==null || "".equals(src) || target==null || "".equals(target)) {

throw new RuntimeException("源路径或目标路径不能为空");

}

File srcFile = new File(src);

List list = new ArrayList();

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 innCMlCPxPPer) {

this.inner = inner;

}

}

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

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java常见数据结构面试题(带答案)
下一篇:Vue的百度地图插件尝试使用
相关文章

 发表评论

暂时没有评论,来抢沙发吧~