分享
 
 
 

超简易图种生成器

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

前几天逛知乎,看到一个问题:“有没有一段代码,让你觉得人类的智慧也可以璀璨无比?”。作为一个渣渣程序猿自然就好奇的点进去看了。

嗯。。结果就是什么都看不懂。感觉全是大牛,各种脑洞。我看了简直就是各种惊奇,心想:卧槽居然还能这样玩儿。

往下翻了好久,看到了一个比较好玩的,说让下载图片,改后缀为rar可以打开。其实这个把戏几年前就见到过了。贴吧里有时候有人发内涵图的时候就这么干过,把种子放到压缩文件,然后放进图片里。

不过那会儿完完全全的小白,啥都不懂,只是觉得挺好玩的,挺好奇怎么弄的,不过也没有去搜这个原理。(太懒了。。。)

看到这我才看了一下是怎么弄的,其实原来就只是一句cmd命令而已:

copy /b a.jpg+b.rar c.jpg

其实就是表示把一个RAR文件拼到一张图片的末尾,生成一个新的图片文件。其实不用rar也可以把其他文件压缩进图片里,只不过生成新的图片之后,改后缀名会打不开文件,提示文件已损坏。一般都是用压缩文件格式的。

回答里还看到答主还说了一句 “当年还有小伙伴写成了界面程序…找不到了。”

想想觉得这个应该挺简单的,无非就是获取一个图片路径,加上一个压缩文件的路径,然后保存生成新的图片嘛。反正当时也无聊,就做着玩一下。。

于是乎,就有了下面这个界面。。。

WinForm在大二的时候学过一点儿,之后就再也没用过了,到现在两年多了。

想着是点这两个文本框,弹出文件选择的窗口。两个都选好后点生成,就弹出要保存文件的窗口,选择地址,输入文件名保存就完了。

说实话在学校还真没有学过这几个控件,或许是学过,不过一直没用过就给忘了吧。嘿嘿嘿...

不管了,打开工具箱一个个看,看着哪个顺眼,感觉是的就拖过来试试。然就有了这几个控件:

分别给两个TextBox添加Click事件。让它们弹出文件选择的窗口,记得筛选一下文件类型

我在textBox1_Click事件里写上 openFileDialog1.ShowDialog(); 后,发现弹出窗体 选择文件之后,文本框还是什么都没有,看来还得自己手动赋值了

PRivatevoidtextBox1_Click(objectsender, EventArgs e)

{//弹出文件选择窗口openFileDialog1.ShowDialog();//获得文件名,包含全路径stringfilePath =openFileDialog1.FileName;if(!string.IsNullOrEmpty(filePath.Trim()))

{//判断是否是图片文件,防止修改文件后缀名等操作boolrs =IsImage(filePath);if(rs)

{//将选中文件的文件名显示到TextBox中txtImg.Text =filePath;

}else{

MessageBox.Show("_(:з」∠)_这不是真的图片文件哦!","提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

}

}

}

这里 IsImage(filePath) 是判断了一下选择的文件到底是不是图片文件。防止别人修改文件后缀名上传。主要就这一句:

System.Drawing.Image img = System.Drawing.Image.FromFile(path);

这会把文件试着转换成Image图片,如果这一句不报错,说明就是图片文件。

现在已经可以获得要压缩的图片 和文件地址了,下一步就是获取用户要保存的新图片的地址了。

在“生成”按钮的点击事件里面,首先得判断图片、和文件的路径是否为空,已经路径文件是否真的存在。

这些判断通过之后,就弹出文件另存为的窗口,同样的,也是用 saveFileDialog1.FileName 就能获取到用户输入文件名之后的文件全路径了。

现在好了,三个都能获取到了。可是接下来的问题来了... 要怎么用程序去调用cmd 并运行这条命令呢??这个我之前也是没有接触过的。。好吧,只好找度娘了。于是就有了下面这段代码:

1privatevoidRunCMD(stringcmd)2{3System.Diagnostics.Process p =newSystem.Diagnostics.Process();4p.StartInfo.FileName ="cmd.exe";5p.StartInfo.UseShellExecute =false;//是否使用操作系统shell启动6p.StartInfo.RedirectStandardInput =true;//接受来自调用程序的输入信息7p.StartInfo.RedirectStandardOutput =true;//由调用程序获取输出信息8p.StartInfo.RedirectStandardError =true;//重定向标准错误输出9p.StartInfo.CreateNoWindow =true;//不显示程序窗口10p.Start();//启动程序1112//向cmd窗口发送输入信息13p.StandardInput.WriteLine(cmd +"&exit");1415p.StandardInput.AutoFlush =true;16//p.StandardInput.WriteLine("exit");17//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死18//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令192021//获取cmd窗口的输出信息22stringoutput =p.StandardOutput.ReadToEnd();23p.WaitForExit();//等待程序执行完退出进程24p.Close();25}

万能的百度哇。。 到这应该就可以搞定了吧。

下面奉上全部代码:

1usingSystem;2usingSystem.Diagnostics;3usingSystem.IO;4usingSystem.Text;5usingSystem.Windows.Forms;6usingSystem.Windows.Forms.VisualStyles;78namespaceImageRar9{10publicpartialclassForm1 : Form11{12publicForm1()13{14InitializeComponent();15}1617privatevoidtextBox1_Click(objectsender, EventArgs e)18{19//选择图片20openFileDialog1.ShowDialog();21//获得文件名,包含全路径22stringfilePath =openFileDialog1.FileName;2324if(!string.IsNullOrEmpty(filePath.Trim()))25{26//判断是否是图片文件,防止修改文件后缀名等操作27boolrs =IsImage(filePath);2829if(rs)30{31//将选中文件的文件名显示到TextBox中32txtImg.Text =filePath;33}34else35{36MessageBox.Show("_(:з」∠)_这不是真的图片文件哦!","提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);37}38}39}4041///<summary>42///判断文件是否为图片43///</summary>44///<param name="path">文件的完整路径</param>45///<returns>返回结果</returns>46publicboolIsImage(stringpath)47{48try49{50System.Drawing.Image img =System.Drawing.Image.FromFile(path);51returntrue;52}53catch(Exception)54{55returnfalse;56}57}5859privatevoidtextBox2_Click(objectsender, EventArgs e)60{61//选择压缩文件62openFileDialog2.ShowDialog();63//获得文件名,包含全路径64stringfilePath =openFileDialog2.FileName;65//将选中文件的文件名显示到TextBox中66txtFile.Text =filePath;6768}6970privatevoidbutton1_Click(objectsender, EventArgs e)71{72stringpath1 =txtImg.Text.Trim();73stringpath2 =txtFile.Text.Trim();7475//判断是否为空76if(string.IsNullOrEmpty(path1))77{78MessageBox.Show("(,,•́ . •̀,,)请先选择一张图片","Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning);79return;80}81elseif(string.IsNullOrEmpty(path2))82{83MessageBox.Show("(,,•́ . •̀,,)请选择你要放进图片里的压缩文件","Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning);84return;85}86//判断文件是否存在87boolflag =true;88if(!File.Exists(path1))89{90flag =false;91MessageBox.Show("ヽ(o`皿′o)ノ图片路径不正确!","Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning);92}93if(!File.Exists(path2))94{95flag =false;96MessageBox.Show("ヽ(o`皿′o)ノ压缩文件路径不正确!","Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning);97}98if(flag)99{100//弹出文件保存窗口101saveFileDialog1.ShowDialog();102//获得用户新命名的图片文件全路径103stringnewFileName =saveFileDialog1.FileName;104105//文件压缩命令 eg: copy /b test.jpg+1.rar test2.jpg106StringBuilder cmd =newStringBuilder();107cmd.AppendFormat("copy /b {0}+{1} {2}", path1, path2, newFileName);108try109{110RunCMD(cmd.ToString());111112DialogResult dr = MessageBox.Show("╭(●`∀´●)╯╰(●’◡’●)╮\r\n生成成功!点击确定查看","成功", MessageBoxButtons.OK, MessageBoxIcon.Information);113if(dr ==DialogResult.OK)114{115Process open =newProcess();116open.StartInfo.FileName ="explorer";117open.StartInfo.Arguments =@"/select,"+newFileName;118open.Start();119}120}121catch(Exception ex)122{123MessageBox.Show("╮(๑•́ ₃•̀๑)╭压缩失败,错误原因:\r\n"+ ex.Message,"Oops!", MessageBoxButtons.OK, MessageBoxIcon.Error);124}125}126127}128129privatevoidRunCMD(stringcmd)130{131System.Diagnostics.Process p =newSystem.Diagnostics.Process();132p.StartInfo.FileName ="cmd.exe";133p.StartInfo.UseShellExecute =false;//是否使用操作系统shell启动134p.StartInfo.RedirectStandardInput =true;//接受来自调用程序的输入信息135p.StartInfo.RedirectStandardOutput =true;//由调用程序获取输出信息136p.StartInfo.RedirectStandardError =true;//重定向标准错误输出137p.StartInfo.CreateNoWindow =true;//不显示程序窗口138p.Start();//启动程序139140//向cmd窗口发送输入信息141p.StandardInput.WriteLine(cmd +"&exit");142143p.StandardInput.AutoFlush =true;144//p.StandardInput.WriteLine("exit");145//向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死146//同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令147148149//获取cmd窗口的输出信息150stringoutput =p.StandardOutput.ReadToEnd();151p.WaitForExit();//等待程序执行完退出进程152p.Close();153154//Console.WriteLine(output);155}156}157}

程序在这里,右键保存图片,改后缀为zip或者rar等压缩文件格式后就可以打开了。

注:保存成gif图片 用浏览器查看可能无法查看,但是用画图或者图片查看器打开是可以显示的。

Win10系统无效,不知道是什么问题。可能是cmd的那个命令在win10没用了吧。Win7、WIN8.1有效,其他未测。

参考资料:C#程序调用cmd执行命令

C#打开文件所在的文件夹

最后:唉,园龄2年多了,还是前几天才开的博客。这才是第一篇。我甚至还犹豫到底要不要写下来。因为感觉这实在太简单了,一点含量都没有,都不好意思写出来,写这到底有没有意义。

不过也想通了,不会就要多记,我记性也差,以前用的东西,学过的东西,过段时间没用就忘了,等某个时候又要用了又去翻以前的代码看。东西又乱,够翻的。以后就记在这里了!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有