漫画批量分割工具-解决在MP4上看漫画
前一段时间买了一个MP4,现在的电子产品真是便宜哪,5寸屏幕的MP4才400元真是实惠。MP4看电影真的是一级棒,但是看漫画问题就来了,小时候穷哪,没有钱买漫画书,多多少少有点漫画情节,现在的漫画大部分都是扫描的,图像格式大分辨率高,在我这个小小的MP4上看起来很吃力,特别是在看双拼漫画时更是吃力的很,这时候我就想到了能不能将双拼漫画搞成单拼的,再加上出血边,在5寸屏上看一定超级棒。
所以动手开发了一上午,现在开放源程序给大家,有能力的兄弟们接着干吧。。哈哈哈。。有更新记得给我发一份。
双拼漫画
转换之后的漫画
程序的开发界面:
核心代码:
1: private List<string> fileList = new List<string>(200);
2: public ComicSplitMainForm()
3: {
4: InitializeComponent();
5: }
6:
7: private void toolStripButtonExit_Click(object sender, EventArgs e)
8: {
9: DialogResult returnValue = MessageBox.Show("您是否要退出?", "退出信息", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
10: if (returnValue == DialogResult.Yes)
11: {
12: Application.Exit();
13: }
14: }
15:
16: private void toolStripButtonSet_Click(object sender, EventArgs e)
17: {
18: ComicSplitSetForm comicsplitSetForm = new ComicSplitSetForm();
19: DialogResult returnValue = comicsplitSetForm.ShowDialog();
20: if (returnValue == DialogResult.OK)
21: {
22: this.toolStripButtonDir.Enabled = true;
23: this.toolStripButtonFile.Enabled = true;
24: this.toolStripButtonSplit.Enabled = true;
25: this.toolStripButtonPrview.Enabled = true;
26: }
27: }
28:
29: private void toolStripButtonPrview_Click(object sender, EventArgs e)
30: {
31:
32: }
33:
34: private void toolStripButtonFile_Click(object sender, EventArgs e)
35: {
36: if (this.openFileDialogSelectFile.ShowDialog() == DialogResult.OK)
37: {
38: this.listViewFile.Items.Clear();
39: fileList.Clear();
40: foreach (string tempFileName in this.openFileDialogSelectFile.FileNames)
41: {
42: fileList.Add(tempFileName);
43: ListViewItem lv = new ListViewItem(Path.GetFileName(tempFileName));
44: lv.SubItems.Add((new FileInfo(tempFileName).Length / 1024) + "KB");
45: lv.SubItems.Add((new FileInfo(tempFileName).LastAccessTime).ToString());
46: this.listViewFile.Items.Add(lv);
47: }
48: }
49: }
50:
51: private void toolStripButtonDir_Click(object sender, EventArgs e)
52: {
53: if (this.folderBrowserDialogAddDir.ShowDialog() == DialogResult.OK)
54: {
55: this.listViewFile.Items.Clear();
56: fileList.Clear();
57: foreach (string tempFileName in Directory.GetFiles(this.folderBrowserDialogAddDir.SelectedPath))
58: {
59: if (Path.GetExtension(tempFileName).Contains("png") || Path.GetExtension(tempFileName).Contains("jpg"))
60: {
61: fileList.Add(tempFileName);
62: ListViewItem lv = new ListViewItem(Path.GetFileName(tempFileName));
63: lv.SubItems.Add((new FileInfo(tempFileName).Length / 1024) + "KB");
64: lv.SubItems.Add((new FileInfo(tempFileName).LastAccessTime).ToString());
65: this.listViewFile.Items.Add(lv);
66: }
67:
68: }
69: }
70: }
71:
72: private void toolStripButtonSplit_Click(object sender, EventArgs e)
73: {
74: if (File.Exists(AppFrameWork.SaveDataName))
75: {
76: string DirectoryName = AppFrameWork.AppDirName + Guid.NewGuid().ToString();
77: Directory.CreateDirectory(DirectoryName);
78: //反序列化读出配置文件
79: ImageLib saveinfo;
80: FileStream filestream = new FileStream(AppFrameWork.SaveDataName, FileMode.Open);
81: BinaryFormatter bf = new BinaryFormatter();
82: saveinfo = (ImageLib)bf.Deserialize(filestream);
83: filestream.Close();
84: int picNumCount = fileList.Count * 2;
85:
86: ThreadDialogWithProcess threadDialogWithProcess = new ThreadDialogWithProcess();
87: threadDialogWithProcess.Text = "生成图片中。。。";
88: ThreadInfoClass threadInfoClass = new ThreadInfoClass();
89: threadInfoClass.ShowForm = threadDialogWithProcess;
90: threadInfoClass.Directoryname = DirectoryName;
91: threadInfoClass.Saveinfo = saveinfo;
92: threadInfoClass.PicNumCount = picNumCount;
93:
94: threadDialogWithProcess.Text = "生成图片中。。。";
95: ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(MakeBigPic), threadInfoClass);
96: threadDialogWithProcess.ShowDialog();
97: Process.Start(DirectoryName);
98:
99: }
100: else
101: {
102: MessageBox.Show("请先进行设定!");
103: }
104: }
105: private void MakeBigPic(object status)
106: {
107: ThreadDialogWithProcess progressWindowForm = (ThreadDialogWithProcess)(status as ThreadInfoClass).ShowForm;
108: string DirectoryName = (status as ThreadInfoClass).Directoryname;
109: ImageLib saveinfo = (status as ThreadInfoClass).Saveinfo;
110: int picNumCount = (status as ThreadInfoClass).PicNumCount;
111: int picNum = 0;
112: try
113: {
114: progressWindowForm.SetupThread(0, picNumCount);
115:
116: foreach (string tempFile in fileList)
117: {
118: Image imgSamplePic = new Bitmap(tempFile);
119: for (int i = 0; i < 2; i++)
120: {
121:
122: #region 数据显示
123: progressWindowForm.SetDisplayText(String.Format("正在处理第{0}条/共{1}条", picNum, picNumCount));
124: progressWindowForm.StepTo(picNum);
125: if (progressWindowForm.IsAborting)
126: {
127: return;
128: }
129: if (progressWindowForm.IsAborting)
130: {
131: return;
132: }
133: #endregion
134:
135: string strDestFile = string.Format(@"{0}\{1:D7}.jpg", DirectoryName, picNum);
136: ImageTool.SplitImage(tempFile, strDestFile, saveinfo.DescRect[i], saveinfo.SrcRect[i]);
137: picNum++;
138: }
139: }
140: }
141: catch (Exception exception)
142: {
143: MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace);
144: }
145: finally
146: {
147: if (progressWindowForm != null)
148: {
149: progressWindowForm.End();
150: }
151: }
152: }
153:
154: private void toolStripButtonTurn90_Click(object sender, EventArgs e)
155: {
156: if (this.openFileDialogSelectFile.ShowDialog() == DialogResult.OK)
157: {
158: fileList.Clear();
159: foreach (string tempFilename in this.openFileDialogSelectFile.FileNames)
160: {
161: fileList.Add(tempFilename);
162: }
163: ThreadDialogWithProcess threadDialogWithProcess = new ThreadDialogWithProcess();
164: threadDialogWithProcess.Text = "正在旋转图片";
165: ThreadInfoClass threadInfoClass = new ThreadInfoClass();
166: threadInfoClass.ShowForm = threadDialogWithProcess;
167:
168: threadDialogWithProcess.Text = "正在旋转图片";
169: ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(MakeRotate90Pic), threadInfoClass);
170: threadDialogWithProcess.ShowDialog();
171: }
172: }
173: private void MakeRotate90Pic(object status)
174: {
175: ThreadDialogWithProcess progressWindowForm = (ThreadDialogWithProcess)(status as ThreadInfoClass).ShowForm;
176: try
177: {
178: progressWindowForm.SetupThread(0, fileList.Count - 1);
179: for (int i = 0; i < fileList.Count; ++i)
180: {
181: progressWindowForm.SetDisplayText(String.Format("正在处理第{0}条/共{1}条", i, fileList.Count));
182: progressWindowForm.StepTo(i);
183:
184: //获得图片
185: Image img = KiRotate90(new Bitmap(fileList[i]));
186: Graphics g = Graphics.FromImage(img);
187: // 绘图平滑程序
188: g.SmoothingMode = SmoothingMode.HighQuality;
189:
190: // 图片输出质量
191: g.CompositingQuality = CompositingQuality.HighQuality;
192: g.Dispose();
193: img.Save(fileList[i], ImageFormat.Jpeg);
194:
195:
196: if (progressWindowForm.IsAborting)
197: {
198: return;
199: }
200: if (progressWindowForm.IsAborting)
201: {
202: return;
203: }
204: }
205: }
206: catch (Exception exception)
207: {
208: MessageBox.Show(exception.Message + Environment.NewLine + exception.StackTrace);
209: }
210: finally
211: {
212: if (progressWindowForm != null)
213: {
214: progressWindowForm.End();
215: }
216: }
217:
218:
219:
220: }
221: public static Bitmap KiRotate90(Bitmap img)
222: {
223: //顺时针旋转90度 RotateFlipType.Rotate90FlipNone
224: //逆时针旋转90度 RotateFlipType.Rotate270FlipNone
225: //水平翻转 RotateFlipType.Rotate180FlipY
226: //垂直翻转 RotateFlipType.Rotate180FlipX
227: try
228: {
229: img.RotateFlip(RotateFlipType.Rotate90FlipNone);
230: return img;
231: }
232: catch
233: {
234: return null;
235: }
236: }
237: }
源程序下载地址:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述