package boneyiyi.tool.image;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.imageio.ImageIO;

/**
* 为了给YiYi节省时间,写了个能自动拼图贴水印的机器人,很多bug,能用就行。
*
* lazybone 2012.04.05
*/
public class Utils {

/************** 需要配置 **********************/
// 是否只保存最终的作品到作品文件夹
static boolean isSaveFinalWorks = true;

// 每个图片上下填充的高度,
static final int modify = 50;

// 是否添加水印
static boolean isAddLogo = true;

// 水印搜索的像素数
static final int logoModify = 80;

/************** 无需配置 *********************/
// 工作室文件夹 "d:/boneyiyi"
static final String workspace = "d:/boneyiyi";

// 水印文件夹
static final String logoAPNG = workspace + "/素材/logo_425_198.png";
static final String logoAPNGTest = workspace + "/素材/logonew.png";

// 工作室文件夹 "d:/boneyiyi"
static final String workspace_todo = workspace + "/车间";

// 文件名后缀,用于搜索
static final String fileName_750wok = "_750wok.jpg";

// 宝贝内页顶部图片
static final String titleFileName = workspace + "/素材/title.jpg";

// 文件名后缀,用于搜索
static final String fileName_ok = "_ok.jpg";

// 作品文件夹
static final String workspace_done = workspace + "/完成作品";

/**
* 开工
*
* @param args
*/
public static void main(String args[]) {
new Utils().startWork();
}

public void startWork() {
// 初始化logo
initLogo();

File[] files = new File(workspace_todo).listFiles();

for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
System.out.println(files[i].getPath() + " is doing...");
new Utils().createThePic(files[i]);
System.out.println(files[i].getPath() + " is done.");
System.out.println();
}
}

System.out.println("well done!");
}

public void createThePic(File mainFile) {
Graphics2D panel;
Graphics2D panel750;
int countLen = 0;
int width = 0;

int curX = 0;
int curY = 0;

ArrayList<BufferedImage> imageList = new ArrayList<BufferedImage>();
File[] files = mainFile.listFiles();

for (int i = 0; i < files.length; i++) {
if (files[i].getPath().contains(fileName_750wok)
|| files[i].getPath().contains(fileName_ok)) {
continue;
}
BufferedImage bImage = loadImageLocal(files[i].getPath());
countLen += bImage.getHeight();
imageList.add(bImage);
width = (width > bImage.getWidth() ? width : bImage.getWidth());
}

// 如果图都是很小的,小于750,就默认width=750;
width = (width > 750 ? width : 750);

BufferedImage panelImage = new BufferedImage(width, countLen,
BufferedImage.TYPE_INT_RGB);

panel = panelImage.createGraphics();
panel.setBackground(Color.WHITE);
panel.setColor(Color.WHITE);
panel.fillRect(0, 0, width, countLen);

// 添加标题
BufferedImage title = loadImageLocal(titleFileName);
curX = (width - title.getWidth()) / 2;
panel.drawImage(title, curX, curY, title.getWidth(), title.getHeight(),
null);
curY += title.getHeight();

for (int i = 0; i < imageList.size(); i++) {
panel.setColor(Color.WHITE);
BufferedImage img = imageList.get(i);

curX = (width - img.getWidth()) / 2;
// 去掉虚边
panel.drawImage(img, curX, curY, img.getWidth(), img.getHeight(),
null);
panel.fillRect(curX, curY, img.getWidth(), modify);
panel.fillRect(curX, curY + img.getHeight() - modify,
img.getWidth(), img.getHeight());

// 加水印
if (isAddLogo == true) {
drawLogo(panel, (width - 750) / 2, curY + modify, 750,
img.getHeight() - modify);
}

curY += img.getHeight();
}

// 文件夹的名字,用在区分不同文件夹的作品
String fnFirst = mainFile.getPath().replace(mainFile.getParent(), "");
if (isSaveFinalWorks == false) {
String fnAll = mainFile.getPath() + "/" + fnFirst + "_" + width
+ "_" + countLen + fileName_ok;// "_ok.jpg"
writeImageLocal(fnAll, panelImage);
System.out.println(fnAll + " ok");
}
// 切割750
BufferedImage panelImage750 = new BufferedImage(750, countLen,
BufferedImage.TYPE_INT_RGB);
panel750 = panelImage750.createGraphics();
panel750.setBackground(Color.WHITE);
panel750.setColor(Color.WHITE);
panel750.fillRect(0, 0, 750, countLen);
panel750.drawImage(panelImage, 0, 0, 750, countLen, (width - 750) / 2,
0, 750 + (width - 750) / 2, countLen, null);
// 写图片750
if (isSaveFinalWorks == false) {
String fn750 = mainFile.getPath() + "/" + fnFirst + "_750_"
+ countLen + fileName_750wok;// "_750wok.jpg";
writeImageLocal(fn750, panelImage750);
System.out.println(fn750 + " ok");
}
// 写图片到外层文件夹
File done = new File(workspace_done);
if (!done.exists()) {
done.mkdir();
}
String fn750OutSide = workspace_done + "/" + fnFirst + "_750_"
+ countLen + fileName_750wok;// "_750wok.jpg";
writeImageLocal(fn750OutSide, panelImage750);
// 关闭
panel.dispose();
panel750.dispose();
}

/**
* 导入本地图片到缓冲区
*/
public static BufferedImage loadImageLocal(String imgName) {
try {
return ImageIO.read(new File(imgName));
} catch (IOException e) {
System.out.println(e.getMessage());
}
return null;
}

/**
* 生成新图片到本地
*/
public static void writeImageLocal(String newImage, BufferedImage img) {
if (newImage != null && img != null) {
try {
File outputfile = new File(newImage);
ImageIO.write(img, "jpg", outputfile);
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

/**
* 绘制logo
*/
public void drawLogo(Graphics2D panel, int x, int y, int w, int h) {
initLogo();

int logoW = logoBufferedImage.getWidth();
int logoH = logoBufferedImage.getHeight();
// logoModify 绘制logo时,往里绘制
int startX = x + logoModify
+ new Random().nextInt(w - logoW - logoModify);
int startY = y + logoModify
+ new Random().nextInt(h - logoH - logoModify);

panel.drawImage(logoBufferedImage, startX, startY, logoW, logoH, null);
}

/**
* 初始化logo
*/
public void initLogo() {
if (logoBufferedImage != null) {
return;
}
BufferedImage img;
try {
// 读取透明png
img = ImageIO.read(new File(logoAPNG));
// 生成一个存放png数据的数组
int rgb[] = new int[img.getWidth() * img.getHeight()];
// 读取png信息
img.getRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0,
img.getWidth());
// 一个新的png
logoBufferedImage = new BufferedImage(img.getWidth(),
img.getHeight(), BufferedImage.TYPE_INT_ARGB);
// 设置数据
logoBufferedImage.setRGB(0, 0, img.getWidth(), img.getHeight(),
rgb, 0, img.getWidth());
System.out.println("Logo is init ok.");

} catch (IOException e) {
e.printStackTrace();
}
}

public static BufferedImage logoBufferedImage;

/**
* 读取透明png水印
*/
public static int[] readLogo() {
BufferedImage img;
try {
// 读取透明png
img = ImageIO.read(new File(logoAPNG));
// 生成一个存放png数据的数组
int rgb[] = new int[img.getWidth() * img.getHeight()];
// 读取png信息
img.getRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0,
img.getWidth());
// 一个新的png
BufferedImage imgNew = new BufferedImage(img.getWidth(),
img.getHeight(), BufferedImage.TYPE_INT_ARGB);
// 设置数据
imgNew.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0,
img.getWidth());

return rgb;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

/**
* 读取透明png水印
*/
public static void readAPng() {
BufferedImage img;
try {
// 读取透明png
img = ImageIO.read(new File(logoAPNG));
// 生成一个存放png数据的数组
int rgb[] = new int[img.getWidth() * img.getHeight()];
// 读取png信息
img.getRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0,
img.getWidth());
// 一个新的png
BufferedImage imgNew = new BufferedImage(img.getWidth(),
img.getHeight(), BufferedImage.TYPE_INT_ARGB);
// 设置数据
imgNew.setRGB(0, 0, img.getWidth(), img.getHeight(), rgb, 0,
img.getWidth());
// 保存到新文件half.png里面
ImageIO.write(imgNew, "PNG", new File(logoAPNGTest));
} catch (IOException e) {
e.printStackTrace();
}
}
}

为了给YiYi节省时间,写了个能自动拼图贴水印的机器人,很多bug,能用就行。...相关推荐

  1. 为了给YiYi节省时间,写了个能自动拼图贴水印的机器人,很多bug,能用就行。

    package boneyiyi.tool.image; import java.awt.Color; import java.awt.Graphics2D; import java.awt.imag ...

  2. html中写一个占内存很大死循环代码,HTML5新特性Bug:这12行代码分分钟让你浏览器崩溃iPhone重启...

    使用这十二行JavaScript代码能让firefox.chrome.safari等众多浏览器崩溃,甚至让iPhone重启? 起因 今天刷推特的时候发现Cyber Security@cyber__se ...

  3. Python 开发者节省时间的 10 个小技巧

    Python 是一个美丽的语言,可以激发用户对它的爱.所以如果你试图加入程序员行列,或者你有点厌倦C++,Perl,Java 和其他语言,我推荐你尝试Python. Python有很多吸引程序员的功能 ...

  4. acer clear 工具_50个能帮你节省时间的开发工具!(值得收藏)-头条

    本文列举出 50 个能够帮你提高开发效率,节省开发时间的 Chrome 扩展和 Web 应用,它们很有可能会在什么时候派上用场.老规矩,先转发.点赞.点再看三连,最后再慢慢阅读,千万别让它在收藏夹里吃 ...

  5. py提取文字中的时间_一次提取100个视频中的文案!节省时间有绝招在手视频文案提取...

    关于一段视频中的文案,我们常常会遇到想要提取的时候,可能有些人会说这还不简单,直接边听边写就是了,是的这确实是一个方法,如果只有少数的视频,少数的文案需要提取的话,但是如果你们遇到工作上的安排让你们提 ...

  6. 对比了上百个python程序员的开发习惯,这10个方法最节省时间!

    前言 观察了100个python的开发习惯,从中做出对比,精选初10个最节省时间的方法,在此送上: 为以后不管是学习还是工作中提高效率 Python 是一个美丽的语言,可以激发用户对它的爱.所以如果你 ...

  7. 长期置顶:作为一个技术人,你为什么有时间写博客?准备应对未来的中年危机

    引言 从开始有规律的写博客以来,我为什么有那么多时间写博客:博主,是每天都写博客写到很晚吗:我又是如何做时间管理的?保证输出的频率. 平时多积累 博主工作的公司弹性工作制,平时工作不是太重工作效率高点 ...

  8. 为你节省时间和挫败感

    既然你已经学会了一些程序的基本知识,让我们更仔细地看看如何设计一个程序.当你坐下来写一个程序时,通常你会遇到一些你想解决的问题,或者你想模拟的情况.新的程序员常常很难理解如何将这个想法转换成实际的代码 ...

  9. 50个能帮你节省时间的开发工具,你用了几个?

    1. Whatruns 一个免费的浏览器扩展程序,只需单击一下按钮,就能帮你识别当前网站上所使到的技术. 官网:https://www.whatruns.com/ 2. Sizzy 开发人员专用的浏览 ...

最新文章

  1. 使用android SDk帮助文档(英文) 下载中文SDK帮助文档(中文)
  2. C++ 之虚函数的实现原理
  3. reactjs 全局状态管理:redux的组成
  4. ubuntu18.04安装windows版本微信
  5. 均值滤波 中值滤波 高斯平滑滤波
  6. 定位排查工作流的计算结果数据量不符合预期的方法
  7. 使用Anaconda3安装pytorch、paddle环境并在pycharm里面进行环境测试
  8. java取multipart_spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比...
  9. 动态规划 —— 求解通配符问题(wildcard)
  10. SVN统计一段时间的日志
  11. eset smart security 无法更新的解决方案
  12. 《东周列国志》第十八回 曹沫手剑劫齐侯 桓公举火爵宁戚
  13. ticktock卖给oracle,Intel拾起Tick-Tock战略:2024/2025年重返CPU巅峰
  14. java如何返回一个空数组?
  15. CSS属性:字体属性和文本属性
  16. Cocos2d-x开发实例:使用Lambda 表达式
  17. poj2455 Secret Milking Machine(二分答案+最大流)
  18. 马云向约旦王后基金会捐助300万美元,帮助阿拉伯难民儿童获得教育机会
  19. 黑苹果重置NVRAM方法,无法进入系统,丢失引导
  20. 关于计算机素养论文,浅谈计算机专业教学中如何提高学生计算机素养

热门文章

  1. hive之窗口函数理解与实践
  2. 操作系统 第七章 死锁
  3. 元宇宙产业委常务副主任委员甘华鸣:狭义元宇宙9大技术:一种基于狭义元宇宙体系结构的观点
  4. Golang边无际一面
  5. 取对数的作用(机器学习的推导公式经常取对数)
  6. 笔记本有没有必要加内存条?
  7. Android——AndroidStudio主题样式、字体设置
  8. win7的远程桌面连接在哪
  9. 如何选择适合你的兴趣爱好(七十),表演
  10. 基金 撰写_撰写可转换的目标网页的7条提示