前言

前一阵子是买火车票的高峰期,然后12306的验证码就遭到各种吐槽。其实大部分验证码没有那么难,大家只是因为买不到票

发泄一下不满的情绪。于是各种恶搞的图就出现了,比如找二次元里人物的矮子,找好男人什么的。。。

想想每次都要打开PS调整位置,做为程序怎么能忍,于是想写个程序来更做这个事,正好也想试试Unity在做工具这方面是否方便。

最后会放上源码~有需要的可以拿去继续改进哈哈。

第一步

首先整理一下需求:

1.显示八个图片,需要能自行导入

2.可以编辑的目标文字(就是所有的XXX)

3.可以截图保存(当然你自己使用QQ截图也可以。。)

是不是很简单。。。

第二步

开始打开Unity做了,查资料写代码~

1.导入图片

显示图片,只需要弄个背景图,然后在上面用2D的UI放上八上Image即可

重点在于要导入自己的八张图,这里主要借助Windows的API了,好在Unity提供了调用DLL的方法。

可以查看下面的Blog操作,我就不重复写了,只写差异化的东西。

http://www.cnblogs.com/U-tansuo/archive/2012/07/10/GetOpenFileName.html

在这里遇到一个问题是上面Blog中没法打开多个文件。

来看一下OpenFileName的结构

public class OpenFileName
{
public int structSize = ;
public IntPtr dlgOwner = IntPtr.Zero;
public IntPtr instance = IntPtr.Zero;
public String filter = null;
public String customFilter = null;
public int maxCustFilter = ;
public int filterIndex = ;
public String file = null;
public int maxFile = ;
public String fileTitle = null;
public int maxFileTitle = ;
public String initialDir = null;
public String title = null;
public int flags = ;
public short fileOffset = ;
public short fileExtension = ;
public String defExt = null;
public IntPtr custData = IntPtr.Zero;
public IntPtr hook = IntPtr.Zero;
public String templateName = null;
public IntPtr reservedPtr = IntPtr.Zero;
public int reservedInt = ;
public int flagsEx = ;
}

问题主要出在file这个记录文件名的变量上,查看了一下MSDN,这个变量在只打开一个文件时是存了文件的文件夹路径+文件名的,

但是当你多选的时候,它是存了多个隔开的内容的,最前面的是文件夹路径,后面是选择的文件名字。而用string读取时,直接就只取

到了最前面的文件夹路径名。就此要把它转为指针(IntPtr),然后再去读取。

List<string> selectedFilesList = new List<string>();

long pointer = (long)ofn.file;
string file = Marshal.PtrToStringAuto(ofn.file); // Retrieve file names
while (file.Length > )
{
selectedFilesList.Add(file); pointer += file.Length * + ;
ofn.file = (IntPtr)pointer;
file = Marshal.PtrToStringAuto(ofn.file);
} string[] slectedfileNames = GetFileNamesByFileList(selectedFilesList); for (int i = ; i < slectedfileNames.Length; i++)
{
StartCoroutine(WaitLoad(slectedfileNames[i], i));
}

那个2其实应该是Char的字节数,用Marshal.SystemDefaultCharSize也是这个值。这样就可以把所有图片的路径都得到了。

2.编辑文字

原先我以为12306只是简单的用了个比较特殊的字体,于是我把字体载下来然后去求字体网搜。

结果没有搜到(平时用这个搜字体还是不错的),应该是加了一些变形算法的字体。为了简便我直接找了个水波字体

感觉勉强能用。。

3.截图保存

这个在Unity里应该算是个很简单的事了,有网友总结了三种方式。

1.Application.CaptureScreenshot

2.创建Texture2D,读取屏幕像素

3.用RenderToTexture来将某个相机所渲染的东西保存到一张Texture中。

根据需要我选择第二种,又可控又方便。不过目前我也只是拿来载全屏,后面其实可以做到想截哪块截哪块。

截图的时候记得要隐藏你的编辑用的UI,然后把要截到图里的UI显示出来。在截完后要把编辑用的UI显示出来。

最后就把截到的图保存到文件中。

    IEnumerator CutImage(string path)
{
cutImage = new Texture2D (Screen.width, Screen.height, TextureFormat.ARGB32, true); Rect rect = new Rect (, , Screen.width, Screen.height); yield return new WaitForEndOfFrame (); cutImage.ReadPixels (rect, , , true);
cutImage.Apply ();
yield return cutImage; byte[] byt = cutImage.EncodeToPNG();
//保存截图
File.WriteAllBytes(path, byt); ChangeToEidtorMode ();
}

第三步

看结果,修细节。嗯······也没啥细节可修的了。

测试一个:

写在最后

本软件纯属娱乐,希望铁道部不会来找我。。。如果你把自己或朋友的十多年的照片整理下让认识的同学来猜,还是挺有

意思的,直接可以在朋友圈搞个竞猜活动嘛,促进一下感情~还可以把自己想恶搞的东西都放上来,舒缓一下情绪。嗯,这样子想想

这个软件还是挺有意义的,哈哈~生活如此艰难,我们需要多一些自娱自乐的东西,用程序创造快乐~。

EXE文件网盘下载:http://pan.baidu.com/s/1i4d0wWP

github:https://github.com/sunstar1989/12306FunImage

源码package下载:http://pan.baidu.com/s/1pJZQ0KN

用Unity写一个12306验证器的恶搞图生成软件的更多相关文章

  1. 【Android Developers Training】 93. 创建一个空验证器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. python 拼写检查代码(怎样写一个拼写检查器)

    原文:http://norvig.com/spell-correct.html 翻译:http://blog.youxu.info/spell-correct.html 怎样写一个拼写检查器 Pete ...

  3. 用 EPWA 写一个 图片播放器 PicturePlayer

    用 EPWA 写一个 图片播放器  PicturePlayer  . 有关 EPWA,见 <我发起并创立了一个 EPWA 的 开源项目>   https://www.cnblogs.com ...

  4. Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验

    (一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...

  5. 一起写一个JSON解析器

    [本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限 ...

  6. 从零开始学习PYTHON3讲义(十四)写一个mp3播放器

    <从零开始PYTHON3>第十四讲 通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏.随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作. ...

  7. Node教程——封装一个token验证器

    重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...

  8. DIY:从零开始写一个 SQL 构建器

    最近在项目中遇到了一个棘手的问题,因为 EF Core 不支持直接生成 Update 语句,所以这个项目就用到了 EFCore.Plus 来实现这个功能,但是 EFCore.Plus 对 SQLite ...

  9. 如何写一个拼写检查器-by Peter Norvig

    本文原著:Peter Norvig  中文翻译:徐宥 上个星期, 我的两个朋友 Dean 和 Bill 分别告诉我说他们对 Google 的快速高质量的拼写检查工具感到惊奇. 比如说在搜索的时候键入 ...

随机推荐

  1. gulp入门教程(详细注解)

    本文转载自http://www.ydcss.com/archives/18 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很 ...

  2. javascript中this指针

    看完此片文章豁然开朗,非常感谢.javascript技术难点(三)之this.new.apply和call详解 下面说一说自己的理解: this指针总是指向调用他的对象,其实我更愿意理解为:this指 ...

  3. Linux 系统把英文修改成中文界面

    1.一般安装后的linux系统都是英文的界面,网上查了一下各种说法都有,我只做了如下的配置就好了,下载个中文包,改一下i18n就完事了,并没有那么复杂 下面上图文: 目前是英文的界面 2.下载个中文包 ...

  4. C# WebForm内置对象2+Repeater的Command

    内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及 ...

  5. MVC5+EF6 入门完整教程八

    本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级. 前面我们讲解EF功能时,已经介绍过一种更新数据库的方式: EF比较model和database,如果两边不一致,程序将会drop and ...

  6. 4412开发板升级4.2之后改了logo开机后屏幕闪解决办法

    荣品4412开发板升级到4.2请注意增加虚拟机内存. 问:荣品4412开发板升级到Android4.2之后,改了logo.4412板子开机后,过一会屏幕就一闪一闪,是什么原因? Android4.2编 ...

  7. Fake chat script for website download

    Are you searching for free fake webchat script then you are at the right place go get download your ...

  8. Java 第二次作业

    package javazuoye;import javax.swing.*; import java.awt.*;import java.awt.event.*;public class dengl ...

  9. IE下new Date不支持传参数的解决

    在FF gloogle浏览器中 用js实例化Date对象时 各种参数都可以换传啊. var date = new Date("2014-10-1 10:24:31"); var d ...

  10. Yii2的邮件配置

    'components' => [ 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'useFileTransport' =&g ...