本来上周双休日没什么事情,准备干点遗留了很久的正经事,结果半途忍不住手贱看新闻,于是被11.28事件触动,随大流的针对棒子及棒子粉抽疯了两天。

没想到到星期一上班脖子就不得劲,顺便查了点资料,发现个山寨版的颈椎矫正图,觉得挺有意思。

如下图:
   
     于是回家后想到自己也做个玩。

问题是,咱爷们不说程序员吧,好歹也是个垒码的,直接PS文字图未免有碍观瞻,于是抽空写了个Java自动生成版的。

代码如下:

package org.test;

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版颈椎自动矫正图相关推荐

  1. 学生信息管理系统Java版(信息自动生成)

    文章目录 前言 一.学生信息管理系统内容要求 二.实现思路 1.构造学生对象 2.构造工具类 3.实现控制台交互 三.代码实现 四.效果展示 总结 前言 本案例作为对Java基础学习后的练习,掌握集合 ...

  2. 使用java.awt.Robot实现java版的自动点击事件

    1.最近遇到了一个需要人工点击的事情,很麻烦,于是找了一下资料,写了一个自动的鼠标点击的程序 使用的包: java.awt.Robot 具体的代码 Robot robot = new Robot(); ...

  3. 魔兽世界怀旧服——按键精灵 Java版(自动技能,练级释放者)

    作为大多回归玩家,艰难的是-- 升级 而且在很多时候,都会按相同组合的一系列技能键来度过相当漫长而枯燥的一段时光. 为了减轻这个痛苦,于是就做了个按键小工具,让角色自己放一系列技能...略微缓解练级的 ...

  4. 左神算法:求最大子矩阵的大小(Java版)

    本题来自左神<程序员面试代码指南>"求最大子矩阵的大小"题目. 题目 给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1 ...

  5. Java版流媒体编解码和图像处理(JavaCPP+FFmpeg)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos FFmpeg.JavaCPP.JavaCV的关系 先简 ...

  6. java订单号 github_GitHub - github2zhang/J12306: 12306抢票程序JAVA版

    J12306抢票助手 12306抢票程序JAVA版,自动登录-验证-查票-购票/自动候补.只需简单的配置即可运行进行快捷抢票. 使用说明 引入jar依赖 手动添加项目lib文件夹中的依赖包 配置文件c ...

  7. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】

    Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...

  8. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  9. 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...

    <我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...

最新文章

  1. 中文语音识别pytorch
  2. Linux学习:shell命令(文件权限、用户、用户组)
  3. python :re模块基本用法
  4. Elasticsearch Java Client 版本区别及起步(5.X 和6.X)
  5. 234. Palindrome Linked List
  6. python数据处理常用函数_pytorch中的自定义数据处理详解
  7. Spring @Async 注解
  8. algorithm头文件下函数整合
  9. 除了写代码,程序员还能做哪些副业呢?
  10. 一种用于茶叶病害识别的低阶学习方法
  11. 大白话5分钟带你走进人工智能-第二十二节决策树系列之概念介绍(1)
  12. 6.企业应用架构模式 --- 会话状态
  13. [转]JS弹出div和关闭
  14. 0matlab计算锚泊系统,一种基于蒙特卡洛仿真的计算锚地容量的方法与流程
  15. NoteBook / 期货及衍生品基础(3)
  16. 2015年至2017年的国产电影圈的数据分析
  17. python openpyxl 操作excel 插入行,列
  18. java应用 cpu占用过高问题分析及解决方法
  19. android 获取sn序列号
  20. C++中为二维数组开辟空间,并释放空间

热门文章

  1. Java面向对象三大特性之继承多态的预习笔记,are you ready? 面对疾风吧!
  2. 关于物联网工程的认识
  3. 第三篇 SG90舵机和HC-SR04测距
  4. 2021安阳学院书法高考成绩查询,2021年安阳学院高考录取通知书查询 通知书什么时候可以收到...
  5. 【动画教程】真封神南极服务端2.52架设第三集
  6. 现在的年轻人,都欠债吗?
  7. 现在买房傻子才掏钱,手把手教你买…
  8. jQuery仿天猫翻牌抽奖代码
  9. Nexus Repository Manage搭建远程仓库私服
  10. 【Genome Biology 2023】EvoAug:通过进化启发的数据增强,提高基因组 DNN 的泛化和可解释性