前幾天逛知乎,看到一個問題:“有沒有一段代碼,讓你覺得人類的智慧也可以璀璨無比?”。作為一個渣渣程序猿自然就好奇的點進去看了。
嗯。。結果就是什么都看不懂。感覺全是大牛,各種腦洞。我看了簡直就是各種驚奇,心想:臥槽居然還能這樣玩兒。
往下翻了好久,看到了一個比較好玩的,說讓下載圖片,改后綴為rar可以打開。其實這個把戲幾年前就見到過了。貼吧里有時候有人發內涵圖的時候就這么干過,把種子放到壓縮文件,然后放進圖片里。
不過那會兒完完全全的小白,啥都不懂,只是覺得挺好玩的,挺好奇怎么弄的,不過也沒有去搜這個原理。(太懶了。。。)
看到這我才看了一下是怎么弄的,其實原來就只是一句cmd命令而已:
copy /b a.jpg+b.rar c.jpg
其實就是表示把一個RAR文件拼到一張圖片的末尾,生成一個新的圖片文件。其實不用rar也可以把其他文件壓縮進圖片里,只不過生成新的圖片之后,改后綴名會打不開文件,提示文件已損壞。一般都是用壓縮文件格式的。
回答里還看到答主還說了一句 “當年還有小伙伴寫成了界面程序…找不到了。”
想想覺得這個應該挺簡單的,無非就是獲取一個圖片路徑,加上一個壓縮文件的路徑,然后保存生成新的圖片嘛。反正當時也無聊,就做著玩一下。。
于是乎,就有了下面這個界面。。。
WinForm在大二的時候學過一點兒,之后就再也沒用過了,到現在兩年多了。
想著是點這兩個文本框,彈出文件選擇的窗口。兩個都選好后點生成,就彈出要保存文件的窗口,選擇地址,輸入文件名保存就完了。
說實話在學校還真沒有學過這幾個控件,或許是學過,不過一直沒用過就給忘了吧。嘿嘿嘿...
不管了,打開工具箱一個個看,看著哪個順眼,感覺是的就拖過來試試。然就有了這幾個控件:
分別給兩個TextBox添加Click事件。讓它們彈出文件選擇的窗口,記得篩選一下文件類型
我在textBox1_Click事件里寫上 openFileDialog1.ShowDialog(); 后,發現彈出窗體 選擇文件之后,文本框還是什么都沒有,看來還得自己手動賦值了
PRivate void textBox1_Click(object sender, EventArgs e) { //彈出文件選擇窗口 openFileDialog1.ShowDialog(); //獲得文件名,包含全路徑 string filePath = openFileDialog1.FileName; if (!string.IsNullOrEmpty(filePath.Trim())) { //判斷是否是圖片文件,防止修改文件后綴名等操作 bool rs = 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 并運行這條命令呢??這個我之前也是沒有接觸過的。。好吧,只好找度娘了。于是就有了下面這段代碼:
1 private void RunCMD(string cmd) 2 { 3 System.Diagnostics.Process p = new System.Diagnostics.Process(); 4 p.StartInfo.FileName = "cmd.exe"; 5 p.StartInfo.UseShellExecute = false; //是否使用操作系統shell啟動 6 p.StartInfo.RedirectStandardInput = true;//接受來自調用程序的輸入信息 7 p.StartInfo.RedirectStandardOutput = true;//由調用程序獲取輸出信息 8 p.StartInfo.RedirectStandardError = true;//重定向標準錯誤輸出 9 p.StartInfo.CreateNoWindow = true;//不顯示程序窗口10 p.Start();//啟動程序11 12 //向cmd窗口發送輸入信息13 p.StandardInput.WriteLine(cmd + "&exit");14 15 p.StandardInput.AutoFlush = true;16 //p.StandardInput.WriteLine("exit");17 //向標準輸入寫入要執行的命令。這里使用&是批處理命令的符號,表示前面一個命令不管是否執行成功都執行后面(exit)命令,如果不執行exit命令,后面調用ReadToEnd()方法會假死18 //同類的符號還有&&和||前者表示必須前一個命令執行成功才會執行后面的命令,后者表示必須前一個命令執行失敗才會執行后面的命令19 20 21 //獲取cmd窗口的輸出信息22 string output = p.StandardOutput.ReadToEnd();23 p.WaitForExit();//等待程序執行完退出進程24 p.Close();25 }
萬能的百度哇。。 到這應該就可以搞定了吧。
下面奉上全部代碼:
1 using System; 2 using System.Diagnostics; 3 using System.IO; 4 using System.Text; 5 using System.Windows.Forms; 6 using System.Windows.Forms.VisualStyles; 7 8 namespace ImageRar 9 { 10 public partial class Form1 : Form 11 { 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 private void textBox1_Click(object sender, EventArgs e) 18 { 19 //選擇圖片 20 openFileDialog1.ShowDialog(); 21 //獲得文件名,包含全路徑 22 string filePath = openFileDialog1.FileName; 23 24 if (!string.IsNullOrEmpty(filePath.Trim())) 25 { 26 //判斷是否是圖片文件,防止修改文件后綴名等操作 27 bool rs = IsImage(filePath); 28 29 if (rs) 30 { 31 //將選中文件的文件名顯示到TextBox中 32 txtImg.Text = filePath; 33 } 34 else 35 { 36 MessageBox.Show("_(:з」∠)_這不是真的圖片文件哦!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); 37 } 38 } 39 } 40 41 /// <summary> 42 /// 判斷文件是否為圖片 43 /// </summary> 44 /// <param name="path">文件的完整路徑</param> 45 /// <returns>返回結果</returns> 46 public bool IsImage(string path) 47 { 48 try 49 { 50 System.Drawing.Image img = System.Drawing.Image.FromFile(path); 51 return true; 52 } 53 catch (Exception) 54 { 55 return false; 56 } 57 } 58 59 private void textBox2_Click(object sender, EventArgs e) 60 { 61 //選擇壓縮文件 62 openFileDialog2.ShowDialog(); 63 //獲得文件名,包含全路徑 64 string filePath = openFileDialog2.FileName; 65 //將選中文件的文件名顯示到TextBox中 66 txtFile.Text = filePath; 67 68 } 69 70 private void button1_Click(object sender, EventArgs e) 71 { 72 string path1 = txtImg.Text.Trim(); 73 string path2 = txtFile.Text.Trim(); 74 75 //判斷是否為空 76 if (string.IsNullOrEmpty(path1)) 77 { 78 MessageBox.Show("(,,•? . •?,,)請先選擇一張圖片", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning); 79 return; 80 } 81 else if (string.IsNullOrEmpty(path2)) 82 { 83 MessageBox.Show("(,,•? . •?,,)請選擇你要放進圖片里的壓縮文件", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning); 84 return; 85 } 86 //判斷文件是否存在 87 bool flag = true; 88 if (!File.Exists(path1)) 89 { 90 flag = false; 91 MessageBox.Show("ヽ(o`皿′o)?圖片路徑不正確!", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning); 92 } 93 if (!File.Exists(path2)) 94 { 95 flag = false; 96 MessageBox.Show("ヽ(o`皿′o)?壓縮文件路徑不正確!", "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Warning); 97 } 98 if (flag) 99 {100 //彈出文件保存窗口101 saveFileDialog1.ShowDialog();102 //獲得用戶新命名的圖片文件全路徑103 string newFileName = saveFileDialog1.FileName;104 105 // 文件壓縮命令 eg: copy /b test.jpg+1.rar test2.jpg106 StringBuilder cmd = new StringBuilder();107 cmd.AppendFormat("copy /b {0}+{1} {2}", path1, path2, newFileName);108 try109 {110 RunCMD(cmd.ToString());111 112 DialogResult dr = MessageBox.Show("╭(●`∀´●)╯╰(●’?’●)╮/r/n生成成功!點擊確定查看", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);113 if (dr == DialogResult.OK)114 {115 Process open = new Process();116 open.StartInfo.FileName = "explorer";117 open.StartInfo.Arguments = @"/select," + newFileName;118 open.Start();119 }120 }121 catch (Exception ex)122 {123 MessageBox.Show("╮(?•? ?•??)╭壓縮失敗,錯誤原因:/r/n" + ex.Message, "Oops!", MessageBoxButtons.OK, MessageBoxIcon.Error);124 }125 }126 127 }128 129 private void RunCMD(string cmd)130 {131 System.Diagnostics.Process p = new System.Diagnostics.Process();132 p.StartInfo.FileName = "cmd.exe";133 p.StartInfo.UseShellExecute = false; //是否使用操作系統shell啟動134 p.StartInfo.RedirectStandardInput = true;//接受來自調用程序的輸入信息135 p.StartInfo.RedirectStandardOutput = true;//由調用程序獲取輸出信息136 p.StartInfo.RedirectStandardError = true;//重定向標準錯誤輸出137 p.StartInfo.CreateNoWindow = true;//不顯示程序窗口138 p.Start();//啟動程序139 140 //向cmd窗口發送輸入信息141 p.StandardInput.WriteLine(cmd + "&exit");142 143 p.StandardInput.AutoFlush = true;144 //p.StandardInput.WriteLine("exit");145 //向標準輸入寫入要執行的命令。這里使用&是批處理命令的符號,表示前面一個命令不管是否執行成功都執行后面(exit)命令,如果不執行exit命令,后面調用ReadToEnd()方法會假死146 //同類的符號還有&&和||前者表示必須前一個命令執行成功才會執行后面的命令,后者表示必須前一個命令執行失敗才會執行后面的命令147 148 149 //獲取cmd窗口的輸出信息150 string output = p.StandardOutput.ReadToEnd();151 p.WaitForExit();//等待程序執行完退出進程152 p.Close();153 154 //Console.WriteLine(output);155 }156 }157 }
程序在這里,右鍵保存圖片,改后綴為zip或者rar等壓縮文件格式后就可以打開了。
注:保存成gif圖片 用瀏覽器查看可能無法查看,但是用畫圖或者圖片查看器打開是可以顯示的。
Win10系統無效,不知道是什么問題??赡苁莄md的那個命令在win10沒用了吧。Win7、WIN8.1有效,其他未測。
參考資料:C#程序調用cmd執行命令
C#打開文件所在的文件夾
最后:唉,園齡2年多了,還是前幾天才開的博客。這才是第一篇。我甚至還猶豫到底要不要寫下來。因為感覺這實在太簡單了,一點含量都沒有,都不好意思寫出來,寫這到底有沒有意義。
不過也想通了,不會就要多記,我記性也差,以前用的東西,學過的東西,過段時間沒用就忘了,等某個時候又要用了又去翻以前的代碼看。東西又亂,夠翻的。以后就記在這里了!
新聞熱點
疑難解答