关注
package nowcoder.pictureZoom;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageOperater {
/**
* 左上方
*/
public static final int LEFT_UPPER = 1;
/**
* 右上方
*/
public static final int RIGHT_UPPER = 2;
/**
* 左下方
*/
public static final int LEFT_LOWER = 3;
/**
* 右下方
*/
public static final int RIGHT_LOWER = 4;
/**
* 中间
*/
public static final int CENTER = 5;
private BufferedImage image;
private String path;
private String type;
/**
* 用File构造一个ImageOperater对象
* @param file 图像文File对象
*/
public ImageOperater(File file) {
try {
this.image = ImageIO.read(file);
this.path = file.getAbsolutePath();
this.type = getType(this.path);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 用路径构造一个ImageOperater对象
* @param path 图像文件路径
*/
public ImageOperater(String path) {
this.path = path;
readImage(this.path);
this.type = getType(this.path);
}
/**
* 使用路径构造BufferedImage对象
* @param path 图像文件路径
*/
private void readImage(String path){
try {
this.image = ImageIO.read(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取文件类型
* @param path
* @return
*/
private String getType(String path){
return path.substring(path.lastIndexOf(".")+1);
}
/**
* 等比放大图片
*/
public ImageOperater blowUpImageEqualProportion(int ratio){
//构造一个按原图放大的图片
BufferedImage image = new BufferedImage(this.image.getWidth()*ratio,
this.image.getHeight()*ratio,
BufferedImage.TYPE_INT_RGB);
//把原图画到构造的图片上
image.getGraphics().drawImage(this.image,0,0,
this.image.getWidth()*ratio,
this.image.getHeight()*ratio,
null);
this.image = image;
//返回ImageOperater对象,以便链式处理图片
return this;
}
/**
* 等比放大图片
*/
public ImageOperater reduceEqualProportion(int ratio){
//构造一个按原图缩放的图片
BufferedImage image = new BufferedImage(this.image.getWidth()/ratio,
this.image.getHeight()/ratio,
BufferedImage.TYPE_INT_RGB);
//把原图画到构造的图片上
image.getGraphics().drawImage(this.image,0,0,this.image.getWidth()/ratio,
this.image.getHeight()/ratio,
null);
this.image = image;
//返回ImageOperater对象,以便链式处理图片
return this;
}
/**
* 缩放到指定大小
*/
public ImageOperater cutNotEqualProportion(int width,int height){
//构造一个指定大小的图片
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
//把原图画到构造的图片上
image.getGraphics().drawImage(this.image,0,0,width, height,null);
this.image = image;
//返回ImageOperater对象,以便链式处理图片
return this;
}
/**
* 添加水印
* @param waterMarkFile 水印文件
* @param POSITION 添加水印的位置
* @return
*/
public ImageOperater addWatermark(File waterMarkFile,int POSITION){
BufferedImage waterMark = null;
try {
waterMark = ImageIO.read(waterMarkFile);
} catch (IOException e) {
e.printStackTrace();
}
//构造一个和原图一样大小的图片
BufferedImage image = new BufferedImage(this.image.getWidth(),
this.image.getHeight(),
BufferedImage.TYPE_INT_RGB);
//把原图画到构造的图片上
image.getGraphics().drawImage(this.image,0,0,this.image.getWidth(),
this.image.getHeight(),
null);
switch (POSITION) {
case LEFT_UPPER:
image.getGraphics().drawImage(waterMark,0,0,
waterMark.getWidth(),
waterMark.getHeight(),null);
break;
case RIGHT_UPPER:
image.getGraphics().drawImage(waterMark,image.getWidth()-waterMark.getWidth(),0,
waterMark.getWidth(),
waterMark.getHeight(),null);
break;
case LEFT_LOWER:
image.getGraphics().drawImage(waterMark,0,image.getHeight()-waterMark.getHeight(),
waterMark.getWidth(),
waterMark.getHeight(),null);
break;
case RIGHT_LOWER:
image.getGraphics().drawImage(waterMark,image.getWidth()-waterMark.getWidth(),
image.getHeight()-waterMark.getHeight(),
waterMark.getWidth(),
waterMark.getHeight(),null);
break;
case CENTER:
image.getGraphics().drawImage(waterMark,(image.getWidth()-waterMark.getWidth())/2,
(image.getHeight()-waterMark.getHeight())/2,
waterMark.getWidth(),
waterMark.getHeight(),null);
break;
default:
throw new RuntimeException("指定位置不正确!");
}
this.image = image;
return this;
}
/**
* 覆盖原图保存
*/
public ImageOperater save(){
FileOutputStream fos = null;
try {
fos = new FileOutputStream(new File(path));
//保存文件
ImageIO.write(image, this.type, fos);
} catch (Exception e) {
e.printStackTrace();
}
//关闭流
try {
if(fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return this;
}
/**
* 保存到指定路径
* @param path
*/
public ImageOperater save(String path,String name){
FileOutputStream fos = null;
File file = new File(path);
//如果路径不存在,尝试创建文件夹
if(!file.exists()){
file.mkdirs();
}
//如果路径不是文件则抛出异常
if(file.isFile()){
throw new RuntimeException("指定路径不是文件夹!");
}
file = new File(file, name+"."+type);
try {
fos = new FileOutputStream(file);
ImageIO.write(image, this.type, fos);
} catch (Exception e) {
e.printStackTrace();
}
//关闭流
try {
if(fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return this;
}
/**
* 保存到指定路径(绝对路径,相对路径)
* @param path
*/
public ImageOperater save(String path,String relativePath,String name){
return save(path+File.pathSeparator+relativePath,name);
}
/**
* 获取BufferedImage对象
* @return
*/
public BufferedImage getImage(){
return this.image;
}
/**
* 获取图片绝对路径
* @return
*/
public String getAbsolutePath(){
return this.path;
}
/**
* 获取文件类型
* @return
*/
public String getImageType(){
return this.type;
}
}
Client:
package nowcoder.pictureZoom;
import java.io.File;
public class Client {
public static void main(String[] args) {
File file = new File("D:/0.jpg");
File watermark = new File("D:/1.png");
ImageOperater operater = new ImageOperater(file);
operater.reduceEqualProportion(3)
//缩小到三分之一并保存
.save("D:","1")
//在右上方加上水印并保存
.addWatermark(watermark, ImageOperater.RIGHT_UPPER)
.save("D:","2")
//下面做个骰子
.addWatermark(watermark, ImageOperater.LEFT_UPPER)
.addWatermark(watermark, ImageOperater.LEFT_LOWER)
.addWatermark(watermark, ImageOperater.RIGHT_LOWER)
.addWatermark(watermark, ImageOperater.CENTER)
.save("D:","3");
operater = new ImageOperater(file);
//当然你也可以按照自己的尺寸剪裁
operater.cutNotEqualProportion(200, 300).save("D:", "cut");
File folder = new File("D:/pic");
Batch(folder, 200, 200);
}
public static void Batch(File file,int weidth,int heigth){
if(!file.isDirectory()){
return;
}
for(File f:file.listFiles()){
if(f.isFile()){
ImageOperater operater = new ImageOperater(f);
operater.cutNotEqualProportion(weidth, heigth).save();
}else{
//递归处理
Batch(f,weidth,heigth);
}
}
}
}
原始文件:
处理后:
这次顺便也把之前一期给头像加个1也一起做了
查看原帖
点赞 评论
相关推荐
牛客热帖
- 1... 5000字说透简历和面试核心要点2.1W
- 2... 除了互联网,还能关注哪些公司5664
- 3... 你怎么看今年的秋招?预测一波5593
- 4... 学后端压力太大了,我昨晚做梦我死了,然后来到了阎王殿,阎王爷让我给生死簿做一个后台管理系统 #段子#5522
- 5... 6.13校招&实习招聘信息汇总5166
- 6... 25校招痛苦文学5153
- 7... 手上只有1个看不上的实习offer要不要去?5111
- 8... 关于实习的转正、边秋招、没实习的相关问题4148
- 9... 海康威视实习真的挺香的2686
- 10... oppo VS 京东2686
正在热议
# 牛客帮帮团来啦!有问必答 #
1323665次浏览 18639人参与
# 非技术岗薪资爆料 #
52895次浏览 728人参与
# OPPO开奖 #
58779次浏览 851人参与
# 和牛牛一起刷题打卡 #
44025次浏览 3512人参与
# 产品每日一题 #
1541次浏览 88人参与
# 来聊聊你目前的求职进展 #
229405次浏览 2900人参与
# 极具前瞻性,现代汽车编程题 #
9141次浏览 183人参与
# 华子oc时间线 #
11082次浏览 60人参与
# 如果可以选,你最想从事什么工作 #
219194次浏览 3388人参与
# 晒一晒我的offer #
4026390次浏览 60368人参与
# 我想象的工作vs实际工作 #
116384次浏览 1798人参与
# 国企vs私企,你更想去? #
34311次浏览 399人参与
# 写简历别走弯路 #
359691次浏览 4525人参与
# 投递实习岗位前的准备 #
752554次浏览 13136人参与
# 软件开发2024笔面经 #
1569330次浏览 36069人参与
# 硬件兄弟们 甩出你的华为奖状 #
37840次浏览 224人参与
# 我发现了面试通关密码 #
408646次浏览 7297人参与
# 24届软开秋招面试经验大赏 #
1237723次浏览 18663人参与
# 互联网公司评价 #
105431次浏览 1363人参与
# 参加过提前批的机械人,你们还参加秋招么 #
16557次浏览 382人参与
# 百度工作体验 #
31759次浏览 314人参与
# 如何缓解入职前的焦虑 #
54953次浏览 553人参与