Java版颈椎自动矫正图
没想到到星期一上班脖子就不得劲,顺便查了点资料,发现个山寨版的颈椎矫正图,觉得挺有意思。
如下图:
于是回家后想到自己也做个玩。
问题是,咱爷们不说程序员吧,好歹也是个垒码的,直接PS文字图未免有碍观瞻,于是抽空写了个Java自动生成版的。
代码如下:
import java.awt.AlphaComposite;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* Copyright 2008
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* @project loonframework
* @author chenpeng
* @email:[email]ceponline@yahoo.com.cn[/email]
* @version 0.1
*/
public class MessageImage extends Canvas {
/**
*
*/
private static final long serialVersionUID = 1L;
private BufferedImage fontImage;
private Graphics2D g2d;
private Image backImage;
final static private int WIDTH = 600;
final static private int HEIGHT = 480;
public MessageImage(final String messages) {
fontImage = new BufferedImage(WIDTH, HEIGHT, 2);
g2d = fontImage.createGraphics();
try {
backImage=ImageIO.read(new File("back.png"));
} catch (IOException e) {
e.printStackTrace();
}
g2d.drawImage(backImage, 0, 0, null);
setAlpha(g2d, 0.7);
int size = 25;
int newLine = (WIDTH / size) - 10;
char[] messageChars = messages.toCharArray();
boolean d = true;
StringBuilder sbr = new StringBuilder();
int count = 0;
int len = messageChars.length - 1;
String fontStyle = "幼圆";
Color color = Color.white;
for (int i = 0, j = 0; i <= len; i++, j++) {
sbr.append(messageChars[i]);
if (j == newLine || (messageChars[i] == '\n')) {
g2d.drawImage(createImageMessages(1, false, sbr.toString(),
color, fontStyle, 1, size, d), count += 30,
(HEIGHT - (sbr.length() * size)) - (size * 4), null);
d = !d;
sbr.delete(0, sbr.length());
j = 0;
} else if (i == len) {
g2d.drawImage(createImageMessages(1, false, sbr.toString(),
color, fontStyle, 1, size, d), count += 30,
(HEIGHT - (sbr.length() * size)) - (size * 4), null);
}
}
setAlpha(g2d, 0.6);
String mes = "Java版颈椎自动矫正图";
fontStyle = "华文新魏";
size = 20;
g2d.drawImage(createImageMessages(0, true, mes, Color.red, fontStyle,
1, size, false), WIDTH - (mes.length() * size) - (size * 2),
HEIGHT - (size * 2), null);
}
/**
* 创建一组图片文字
*
* @param aspect
* @param isRow
* @param messages
* @param color
* @param name
* @param style
* @param size
* @param d
* @return
*/
public static BufferedImage createImageMessages(final int aspect,
final boolean isRow, final String messages, final Color color,
final String name, final int style, final int size, final boolean d) {
final int flength = messages.length();
final int nowSize = size * flength;
BufferedImage fontImages;
if (isRow)
fontImages = new BufferedImage(nowSize, size, 2);
else
fontImages = new BufferedImage(size, nowSize, 2);
Graphics2D graphics2d = fontImages.createGraphics();
char[] messageChars = messages.toCharArray();
if (d) {
char[] temp = new char[flength];
for (int i = 0, j = flength - 1; i < flength; i++, j--) {
temp[j] = messageChars[i];
}
messageChars = temp;
}
if (isRow)
for (int i = 0; i < flength; i++) {
graphics2d.drawImage(createImageMessage(aspect,
messageChars[i], color, name, style, size, d),
i * size, 0, null);
}
else
for (int i = 0; i < flength; i++) {
graphics2d.drawImage(createImageMessage(aspect,
messageChars[i], color, name, style, size, d), 0, i
* size, null);
}
graphics2d.dispose();
System.gc();
return fontImages;
}
/**
* 创建单独图片文字
*
* @param aspect
* @param message
* @param color
* @param name
* @param style
* @param size
* @param d
* @return
*/
public static BufferedImage createImageMessage(final int aspect,
final char message, final Color color, final String name,
final int style, final int size, final boolean d) {
final int nowSize = size + 1;
BufferedImage fontImage = new BufferedImage(nowSize, nowSize, 2);
Graphics2D graphics2d = fontImage.createGraphics();
graphics2d.setColor(color);
graphics2d.setFont(new Font(name, style, size));
// 设定图像显示状态
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_ENABLE);
hints.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_SPEED);
hints.put(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
hints.put(RenderingHints.KEY_FRACTIONALMETRICS,
RenderingHints.VALUE_FRACTIONALMETRICS_ON);
hints.put(RenderingHints.KEY_COLOR_RENDERING,
RenderingHints.VALUE_COLOR_RENDER_QUALITY);
hints.put(RenderingHints.KEY_DITHERING,
RenderingHints.VALUE_DITHER_DISABLE);
graphics2d.setRenderingHints(hints);
graphics2d.drawString(String.valueOf(message), 0, size - 3);
graphics2d.dispose();
switch (aspect) {
case 0:
break;
case 1:
fontImage = MessageImage.rotateImage(fontImage, 90, d);
break;
case 2:
fontImage = MessageImage.rotateImage(fontImage, 180, d);
break;
case 3:
fontImage = MessageImage.rotateImage(fontImage, 360, d);
break;
}
return fontImage;
}
public void paint(Graphics g) {
g.drawImage(fontImage, 0, 0, null);
}
/**
* 水平翻转当前图像
*
* @return
*/
public static BufferedImage rotateImage(final BufferedImage image) {
int w = image.getWidth();
int h = image.getHeight();
BufferedImage img;
Graphics2D graphics2d;
(graphics2d = (img = new BufferedImage(w, h, image.getColorModel()
.getTransparency())).createGraphics()).drawImage(image, 0, 0,
w, h, w, 0, 0, h, null);
graphics2d.dispose();
return img;
}
/**
* 旋转图像为指定角度
*
* @param degree
* @return
*/
public static BufferedImage rotateImage(final BufferedImage image,
final int angdeg, final boolean d) {
int w = image.getWidth();
int h = image.getHeight();
int type = image.getColorModel().getTransparency();
BufferedImage img;
Graphics2D graphics2d;
(graphics2d = (img = new BufferedImage(w, h, type)).createGraphics())
.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2d.rotate(d ? -Math.toRadians(angdeg) : Math.toRadians(angdeg),
w / 2, h / 2);
graphics2d.drawImage(image, 0, 0, null);
graphics2d.dispose();
return img;
}
final static public void setAlpha(final Graphics2D g, final double d) {
AlphaComposite alphacomposite = AlphaComposite
.getInstance(3, (float) d);
g.setComposite(alphacomposite);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Frame frame = new Frame();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame
.add(new MessageImage(
"每天面对计算机\n不是垒码、就是泡论坛、再不然就是和脑残作斗争,爆个哈韩吧,攻击个棒子网什么的,再闲时就写写Blog,转转Google,"
+ "总之24小时离不开电脑,离不开网络(已被纳入我国精神病症状|||),长时间不活动,这颈椎可怎么受的了?没办法,想点办法解决吧。"
+ "最近有人说图片能治疗颈椎病,我却偏不信那个邪,就几句话能费人多大的力气去看?说到底还真能累死活人不成?"
+ "这左转右绕上窜下跳的,除了费点眼睛,怎么可能把脖子一块运动起来?您说是不是这道理?"));
frame.setSize(WIDTH + 5, HEIGHT + 25);
frame.setResizable(false);
frame.setTitle("Java版颈椎自动矫正图");
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
效果图如下:
仔细说起来,这就和各大小说门户生成图片版小说的原理一般无二,毫无技术难度可言,不过毕竟写了,也就丢出来在Blog凑个数。
那位有时间的话(或者等以后鄙人闲的没事),可以做个自动导出,弄套资治通鉴全文之类的图片做颈椎矫正,试验下连续的看完整本颈椎是轻松了,还是碎掉了……
本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/116597
Java版颈椎自动矫正图相关推荐
- 学生信息管理系统Java版(信息自动生成)
文章目录 前言 一.学生信息管理系统内容要求 二.实现思路 1.构造学生对象 2.构造工具类 3.实现控制台交互 三.代码实现 四.效果展示 总结 前言 本案例作为对Java基础学习后的练习,掌握集合 ...
- 使用java.awt.Robot实现java版的自动点击事件
1.最近遇到了一个需要人工点击的事情,很麻烦,于是找了一下资料,写了一个自动的鼠标点击的程序 使用的包: java.awt.Robot 具体的代码 Robot robot = new Robot(); ...
- 魔兽世界怀旧服——按键精灵 Java版(自动技能,练级释放者)
作为大多回归玩家,艰难的是-- 升级 而且在很多时候,都会按相同组合的一系列技能键来度过相当漫长而枯燥的一段时光. 为了减轻这个痛苦,于是就做了个按键小工具,让角色自己放一系列技能...略微缓解练级的 ...
- 左神算法:求最大子矩阵的大小(Java版)
本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...
- Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos FFmpeg.JavaCPP.JavaCV的关系 先简 ...
- java订单号 github_GitHub - github2zhang/J12306: 12306抢票程序JAVA版
J12306抢票助手 12306抢票程序JAVA版,自动登录-验证-查票-购票/自动候补.只需简单的配置即可运行进行快捷抢票. 使用说明 引入jar依赖 手动添加项目lib文件夹中的依赖包 配置文件c ...
- Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】
Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...
<我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...
最新文章
- 中文语音识别pytorch
- Linux学习:shell命令(文件权限、用户、用户组)
- python :re模块基本用法
- Elasticsearch Java Client 版本区别及起步(5.X 和6.X)
- 234. Palindrome Linked List
- python数据处理常用函数_pytorch中的自定义数据处理详解
- Spring @Async 注解
- algorithm头文件下函数整合
- 除了写代码,程序员还能做哪些副业呢?
- 一种用于茶叶病害识别的低阶学习方法
- 大白话5分钟带你走进人工智能-第二十二节决策树系列之概念介绍(1)
- 6.企业应用架构模式 --- 会话状态
- [转]JS弹出div和关闭
- 0matlab计算锚泊系统,一种基于蒙特卡洛仿真的计算锚地容量的方法与流程
- NoteBook / 期货及衍生品基础(3)
- 2015年至2017年的国产电影圈的数据分析
- python openpyxl 操作excel 插入行,列
- java应用 cpu占用过高问题分析及解决方法
- android 获取sn序列号
- C++中为二维数组开辟空间,并释放空间
热门文章
- Java面向对象三大特性之继承多态的预习笔记,are you ready? 面对疾风吧!
- 关于物联网工程的认识
- 第三篇 SG90舵机和HC-SR04测距
- 2021安阳学院书法高考成绩查询,2021年安阳学院高考录取通知书查询 通知书什么时候可以收到...
- 【动画教程】真封神南极服务端2.52架设第三集
- 现在的年轻人,都欠债吗?
- 现在买房傻子才掏钱,手把手教你买…
- jQuery仿天猫翻牌抽奖代码
- Nexus Repository Manage搭建远程仓库私服
- 【Genome Biology 2023】EvoAug:通过进化启发的数据增强,提高基因组 DNN 的泛化和可解释性