前言

前一阵子是买火车票的高峰期,然后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. 项目公共js(vue.js)

    var urlHead = "http://hm.runorout.com/";// var urlHead = "/";/*加入跑班相关*/var urlGe ...

  2. Oculus安装问题

    1.必须FQ,可采用蓝灯,或其他vpn 2.Your computer doesn't meet Rift's recommended specifications 如果某些硬件达不到推荐配置(比如我 ...

  3. 图表,列表在同一DIV里切换显示()

    JS: function changeTable(){ $(".countTable").slideDown(); $(".countChart").css(& ...

  4. 版本控制简介,git使用----使用GitHub托管代码

    关于版本控制: 很久以前,人们苦于对写过的代码进行版本的管理,经常过了一段时间想恢复原来写过的代码却又忘了不知道丢到哪儿去了,有的人用加上时间后缀来命名文件的方法,便于后期维护,但是这样做的麻烦也很大 ...

  5. 用超链接提交表单,实现在动态网页的url中隐藏参数

    动态网页中怎么隐藏url参数传递 我们在做动态网站的时候往往会在各个页面之间传递参数,而这些参数的名称和值都会在url地址栏中被暴露出来,这样一方面不安全,另一方面也不便于搜索引擎的收录,有的时候还有 ...

  6. mysql数据库的导入导出

    当我们在操作数据库的时候,难免会遇到数据导入导出的一些操作,今天突然学到了这个知识点,特意来给大家分享. 我用的是data的这条数据 1.使用数据 mysql> use data; Databa ...

  7. ACCESS中计算日均值

    如图所示,现有时间数据的时间字段是精确到时分秒的,现在需要计算PM2.5的日平均值,因此在查询时需要过滤时间字段的格式,去掉时分秒部分,只提取年月日部分. 查找资料,发现一般用CONVERT()函数实 ...

  8. C# winform中读取HTML代码

    这次的任务是在winform建立一个表格,表格第一列需要绑定数据,表格的第一行也需要绑定数据,而其他的单元格数据则是根据对应的行数据和列数据进行提取. 询问过后,需要在后台拼接HTML代码实现这个功能 ...

  9. BZOJ1828 [Usaco2010 Mar]balloc 农场分配

    直接贪心,我们把线段按照右端点从小到大排序,然后一个个尝试插入即可... 来证明贪心的正确性: 不妨设贪心得到的答案集合为$S$,最优解的答案集合为$T$ 若$S$不是最优解,那么$S \not= T ...

  10. 关于RequireJS与AngularJS的集成文档

    为什么要整合RequireJS RequireJS是一个Javascript 文件和模块框架,通过模块的方式来配置js文件之间的依赖关系,遵守的是CommonJS的AMD标准. 在开发的时候则无需关注 ...