WPF纯手工两步打造图片切割工具(一)
1、四种图片切割方式:缩放:指定宽高(可能变形)、缩放:指定宽(高按比例)、缩放:指定高(宽按比例)、裁减:指定宽高。
2、批量图片切割。
3、目标存储区同名文件处理:直接覆盖、重新命名。
4、支持水印文字添加(图片右下角10px)。
5、动画效果。
6、支持自设定插补模式和呈现质量。
(一)界面布局及数据初始化
(二)编码实现
窗口上最上方是操作区,包括一些设置和启动转换等操作,中间区域是图片预览区域,每一张要处理的图片都会显示在中间区域,最下方是缩略图列表,每一张处理的图片都会添加到这里。当鼠标移动到缩略图列表图像上时,在中间区域也会显示该图的放大版。通过XAML可以很清楚的看出整个窗口分上、中、下三部分:
XAML布局:
第一个Grid行里放置操作项的相关控件:
2 <Grid>
3
4 </Grid>
5 </GroupBox>
<Image Name="imgMain" Opacity="0" Canvas.Left="1" Canvas.Top="-114" Height="557" Stretch="Fill" Width="778">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform CenterX="400" CenterY="300"/>
<RotateTransform CenterX="400" CenterY="300"/>
<TranslateTransform Y="0"/>
</TransformGroup>
</Image.RenderTransform>
<Image.Effect>
<DropShadowEffect Color="Black" BlurRadius="5" Direction="-45" ShadowDepth="5"/>
</Image.Effect>
</Image>
</Canvas>
<my:UcProgressBar Grid.Row="1" HorizontalAlignment="Left" Margin="0,314,0,0" x:Name="ucProgressBar1" VerticalAlignment="Top" Width="794"/>
<ScrollViewer.Background>
<LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
<GradientStop Color="#55F3F384" Offset="0.408"/>
<GradientStop Color="#AA056012" Offset="1"/>
<GradientStop Color="#AA056012"/>
</LinearGradientBrush>
</ScrollViewer.Background>
<StackPanel x:Name="spnlView" Margin="0,0,0,0" Height="90" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Hidden"/>
</ScrollViewer>
2、逻辑处理
当图片处理操作启动后,每个待处理的图片都会从主区域以动画从无到有地移动到最下方的缩略图列表中:动画开始——移动(透明度、大小,位置)——处理图片切割——添加到缩略图列表——下一个动画开始。。。如此反复所有被选中的图片。
处理选项设置了多个自定义,为了方便方便窗体选择操作,所以构造了枚举的集合以填充下拉列表,这里要进行选项列表与枚举的转。
(1)插补模式(InterpolationModeData):System.Drawing.Drawing2D.InterpolationMode 枚举指定在缩放或旋转图像时使用的算法。
2 /// 插补模式 System.Drawing.Drawing2D.InterpolationMode 枚举指定在缩放或旋转图像时使用的算法
3 ///</summary>
4 publicclass InterpolationModeData
5 {
6 ///<summary>
7 /// 插补模式
8 ///</summary>
9 ///<returns></returns>
10 publicstatic List<InterpolationModeItem> GetInterpolationModes()
11 {
12 List<InterpolationModeItem> list =new List<InterpolationModeItem>();
13 //list.Add(new InterpolationModeItem() { Key = -1, Text = "Invalid" });
14 list.Add(new InterpolationModeItem() { Key =0, Text ="Default" });
15 list.Add(new InterpolationModeItem() { Key =1, Text ="Low" });
16 list.Add(new InterpolationModeItem() { Key =2, Text ="High" });
17 list.Add(new InterpolationModeItem() { Key =3, Text ="Bilinear" });
18 list.Add(new InterpolationModeItem() { Key =4, Text ="Bicubic" });
19 list.Add(new InterpolationModeItem() { Key =5, Text ="NearestNeighbor" });
20 list.Add(new InterpolationModeItem() { Key =6, Text ="HighQualityBilinear" });
21 list.Add(new InterpolationModeItem() { Key =7, Text ="HighQualityBicubic" });
22 return list;
23 }
24 }
25
26 ///<summary>
27 ///
28 ///</summary>
29 publicclass InterpolationModeItem
30 {
31 int _key;
32
33 publicint Key
34 {
35 get { return _key; }
36 set { _key = value; }
37 }
38 string _text;
39
40 publicstring Text
41 {
42 get { return _text; }
43 set { _text = value; }
44 }
45 }
2 /// 呈现质量:指定是否将平滑处理(抗锯齿)应用于直线、曲线和已填充区域的边缘
3 ///</summary>
4 publicclass SmoothingModeData
5 {
6 ///<summary>
7 /// 呈现质量
8 ///</summary>
9 ///<returns></returns>
10 publicstatic List<SmoothingModeItem> GetSmoothingModes()
11 {
12 List<SmoothingModeItem> list =new List<SmoothingModeItem>();
13 //list.Add(new SmoothingModeItem() { Key = -1, Text = "Invalid" });
14 list.Add(new SmoothingModeItem() { Key =0, Text ="Default" });
15 list.Add(new SmoothingModeItem() { Key =1, Text ="HighSpeed" });
16 list.Add(new SmoothingModeItem() { Key =2, Text ="HighQuality" });
17 list.Add(new SmoothingModeItem() { Key =3, Text ="None" });
18 list.Add(new SmoothingModeItem() { Key =4, Text ="AntiAlias" });
19 return list;
20 }
21 }
22
23 publicclass SmoothingModeItem
24 {
25 int _key;
26
27 publicint Key
28 {
29 get { return _key; }
30 set { _key = value; }
31 }
32 string _text;
33
34 publicstring Text
35 {
36 get { return _text; }
37 set { _text = value; }
38 }
39 }
2 {
3 publicstatic List<TailorTypeItem> GetTailorTypes()
4 {
5 List<TailorTypeItem> list =null;
6 list =new List<TailorTypeItem>();
7 list.Add(new TailorTypeItem() { Key ="WH", Text ="缩放:指定宽高(可能变形)" });
8 list.Add(new TailorTypeItem() { Key ="W", Text ="缩放:指定宽(高按比例)" });
9 list.Add(new TailorTypeItem() { Key ="H", Text ="缩放:指定高(宽按比例)" });
10 list.Add(new TailorTypeItem() { Key ="Cut", Text ="裁减:指定宽高" });
11 return list;
12 }
13 }
14
15 publicclass TailorTypeItem
16 {
17 string _key;
18
19 publicstring Key
20 {
21 get { return _key; }
22 set { _key = value; }
23 }
24 string _text;
25
26 publicstring Text
27 {
28 get { return _text; }
29 set { _text = value; }
30 }
31 }
由于要支持批量处理,所以在选择待处理图片的时候应该可以多选,并且设定在打开目录窗口时只显示图片资源:*.jpg *.gif *.png。
2 ofd.Multiselect =true;
3 ofd.Filter ="图片文件(*.jpg *.gif *.png)|*.jpg;*.gif;*.png|All Files (*.*)|*.*";
转载于:https://www.cnblogs.com/solan/archive/2011/04/08/2009231.html
WPF纯手工两步打造图片切割工具(一)相关推荐
- WPF纯手工两步打造图片切割工具(二)
上一节已经完成了功能需求和界面布局,这一节就说明一下编码. 本文分两部分: (一)界面布局及数据初始化 (二)编码实现 1. 既然要求支持批量处理,那么一次就应该允许选择多个文件,在上一节的最后已经说 ...
- 《安富莱嵌入式周报》第282期:CMSIS-DSP手册引入计算图,树莓派单片机RP2040超频到1GHz,COBS字节编码算法,纯手工为PS1打造全新亚克力外壳
往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...
- ShoeBox一个超级好用的图片切割工具
ShoeBox一个超级好用的图片切割工具 两款图片切割工具 ShoeBox:http://renderhjs.net/shoebox/ BigShear:https://www.fancynode.c ...
- 一个非常好用的图片切割工具(c# winform开发)
本人业余时间开发了一个图片切割工具,非常好用,也很灵活! 特别对大型图片切割,更能体现出该软件的优势! 功能说明 可以设定切割的高度和宽度.切割线可以上下拖动,可以增加一个切割区域,可设定某个区域不参 ...
- [工具集]等比序列帧图片切割工具
快速对图片进行等比裁剪,导出分类好的文件夹. 工具基于Qt编写,因为代码不知道放哪了,暂不支持批处理操作 效果: 下载: https://pan.baidu.com/s/1gvGvLVPABNuZ1t ...
- C#图片处理类(颜色透明化,图片切割,图片合并,图片旋转等)(转)
目录 1.背景透明化 2.指定颜色透明化 3.指定颜色替换成另一种颜色 4.图片按比例缩放 5.图片旋转 6.图片更改透明度 7.图片添加文字 8. ...
- 消防管件做的机器人图片_报废消防器材变身“机器人” 由消防官兵纯手工打造(图)...
原标题:报废消防器材变身"机器人" 由消防官兵纯手工打造(图) 由报废的消防零配件组成的机器人模型. 厦门网讯 (厦门日报记者林路然通讯员阙凤芳曾德猛)远看好似变形金刚,凑近还会说 ...
- 19岁「天才少年」自制CPU!1200个晶体管,纯手工打造
大家好,我是张巧龙,在推特上看到一个19岁的博主,耗时整整3年,纯手工自制1200个晶体管的CPU. 这位叫做 Sam Zeloof 的美国大学生,最终打造出1200个晶体管的CPU! 在10微米 ...
- ☆☆☆ 纯手工打造个性化的 GhostXP 系统 ☆☆☆
既然是用纯手工来制作万能克隆系统,那么能用手工做到的事情就尽量用手工来做,尽量少用自动化的功能去实现,这样不仅能够详细的了解和学习系统封装的全过程,而且还能感受到封装系统带来的无穷乐趣. 大部分内容参 ...
最新文章
- 利用python3 调用zabbix接口完成批量加聚合图形(screens)
- 2019年IT人加薪的9大神器
- xpdf将pdf转换为html,(WordExcelPDF文件转换成HTML整理.docx
- 无参数实例化Configuration对象以及addResource无法加载core-site.xml中的内容
- 打开Eclipse时出现Failed to create the Java Virtual Machine
- Zabbix之监控Mysql性能
- 【原创】sharepoint webpart COPY部署的办法
- Python类访问限制
- 使用X Manager远程CentOS 7服务器(XDMCP)
- mysql ubuntu 17.04_1、mysql 5.7 ubuntu17.04
- 吴恩达 深度学习 编程作业(2-1.1) Initialization
- ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
- IntelliJ IDEA、Kotlin、PyCharm 背后公司 JetBrains 遭美国调查!
- 牛顿插值法的Python程序
- 谷歌浏览器好用的插件
- js中怎样把ASCII码中的字符与十进制的数相互转换-学习笔记
- 浏览器打开exe程序
- Linux从删库到跑路的命令,使用 trash-cli 跳出 rm 命令从删库到跑路的深渊
- matlab中给信号添加高斯白噪声的两种方法,awgn计算过程,randn函数
- 【我遇到了更好的你】