WPF纯手工两步打造图片切割工具(一)
生活随笔
收集整理的這篇文章主要介紹了
WPF纯手工两步打造图片切割工具(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、功能說明
1、四種圖片切割方式:縮放:指定寬高(可能變形)、縮放:指定寬(高按比例)、縮放:指定高(寬按比例)、裁減:指定寬高。
2、批量圖片切割。
3、目標存儲區同名文件處理:直接覆蓋、重新命名。
4、支持水印文字添加(圖片右下角10px)。
5、動畫效果。
6、支持自設定插補模式和呈現質量。 本文分兩部分:
(一)界面布局及數據初始化
(二)編碼實現 效果預覽: 上周末無聊至極出去溜達,順便帶著相機抓了一些有趣的東西,回來本來打算共享的網上,可是當從相機把照片導到電腦上時,幾十張的高像素圖片最小的也有5M!如果原圖上傳到網上,即使有網站給充足的空間,但網速也會影響上傳及瀏覽效果。沒辦法就用Photoshop一張張修改,還沒處理10張就煩的頭頂!圖像->圖像大小-> 寬高->確定!重復!并且PS加載高像素圖也很慢。所以干脆用WPF拖幾個控件,造一個方便的圖片切割小工具,對圖像質量要求不很高的話足夠用了。 二、布局 1、窗體布局
窗口上最上方是操作區,包括一些設置和啟動轉換等操作,中間區域是圖片預覽區域,每一張要處理的圖片都會顯示在中間區域,最下方是縮略圖列表,每一張處理的圖片都會添加到這里。當鼠標移動到縮略圖列表圖像上時,在中間區域也會顯示該圖的放大版。通過XAML可以很清楚的看出整個窗口分上、中、下三部分:
?
XAML布局:
第一個Grid行里放置操作項的相關控件: 1 <GroupBox x:Name="gpSet" Header="設置" Height="116" HorizontalAlignment="Left" VerticalAlignment="Top" Width="794" Foreground="White">
2 <Grid>
3
4 ?</Grid>
5 </GroupBox> 第二個Grid行里放置動畫處理所用到的Image和進度條: <Canvas Grid.Row="1" HorizontalAlignment="Left" Name="canvas1" VerticalAlignment="Top" Height="334" Width="778">
<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"/> 第三個Grid行里放置縮略圖列表控件: <ScrollViewer x:Name="scrolls" Margin="0,0,0,0" Grid.Row="2" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="110" Width="794" MouseLeave="scrolls_MouseLeave">
<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> 其中為了方便使縮略圖列表在有限的寬度內全部顯示,必須用橫向滾動條處理,外面放置ScrollViewer指定寬度:788px,并讓其顯示橫向滾動條。內置的StackPanel不設置寬度,使其根據內容自適應寬,如此以來便可以借助ScrollViewer的橫向滾動條瀏覽所有的縮略圖。
2、邏輯處理
當圖片處理操作啟動后,每個待處理的圖片都會從主區域以動畫從無到有地移動到最下方的縮略圖列表中:動畫開始——移動(透明度、大小,位置)——處理圖片切割——添加到縮略圖列表——下一個動畫開始。。。如此反復所有被選中的圖片。 3、數據初始化
處理選項設置了多個自定義,為了方便方便窗體選擇操作,所以構造了枚舉的集合以填充下拉列表,這里要進行選項列表與枚舉的轉。
(1)插補模式(InterpolationModeData):System.Drawing.Drawing2D.InterpolationMode 枚舉指定在縮放或旋轉圖像時使用的算法。 View Code 1 ///<summary>
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)呈現質量(SmoothingModeData):System.Drawing.Drawing2D. SmoothingMode 枚舉指定是否將平滑處理(抗鋸齒)應用于直線、曲線和已填充區域的邊緣。 View Code 1 ///<summary>
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 } (3)圖片處理方式(TailorTypeData):縮放:指定寬高(可能變形)、縮放:指定寬(高按比例)、縮放:指定高(寬按比例)、裁減:指定寬高。根據處理方式的不同決定是否必須填寫寬或高。 View Code 1 publicclass TailorTypeData
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 } (4)選擇圖片資源
由于要支持批量處理,所以在選擇待處理圖片的時候應該可以多選,并且設定在打開目錄窗口時只顯示圖片資源:*.jpg *.gif *.png。 1 System.Windows.Forms.OpenFileDialog ofd =new System.Windows.Forms.OpenFileDialog();
2 ofd.Multiselect =true;
3 ofd.Filter ="圖片文件(*.jpg *.gif *.png)|*.jpg;*.gif;*.png|All Files (*.*)|*.*"; 這一節就到這里,下一節主要描述邏輯編碼部分,爭取達到盡量詳盡明了! 試用下載 謝謝您能提出改善意見!
1、四種圖片切割方式:縮放:指定寬高(可能變形)、縮放:指定寬(高按比例)、縮放:指定高(寬按比例)、裁減:指定寬高。
2、批量圖片切割。
3、目標存儲區同名文件處理:直接覆蓋、重新命名。
4、支持水印文字添加(圖片右下角10px)。
5、動畫效果。
6、支持自設定插補模式和呈現質量。 本文分兩部分:
(一)界面布局及數據初始化
(二)編碼實現 效果預覽: 上周末無聊至極出去溜達,順便帶著相機抓了一些有趣的東西,回來本來打算共享的網上,可是當從相機把照片導到電腦上時,幾十張的高像素圖片最小的也有5M!如果原圖上傳到網上,即使有網站給充足的空間,但網速也會影響上傳及瀏覽效果。沒辦法就用Photoshop一張張修改,還沒處理10張就煩的頭頂!圖像->圖像大小-> 寬高->確定!重復!并且PS加載高像素圖也很慢。所以干脆用WPF拖幾個控件,造一個方便的圖片切割小工具,對圖像質量要求不很高的話足夠用了。 二、布局 1、窗體布局
窗口上最上方是操作區,包括一些設置和啟動轉換等操作,中間區域是圖片預覽區域,每一張要處理的圖片都會顯示在中間區域,最下方是縮略圖列表,每一張處理的圖片都會添加到這里。當鼠標移動到縮略圖列表圖像上時,在中間區域也會顯示該圖的放大版。通過XAML可以很清楚的看出整個窗口分上、中、下三部分:
?
XAML布局:
第一個Grid行里放置操作項的相關控件: 1 <GroupBox x:Name="gpSet" Header="設置" Height="116" HorizontalAlignment="Left" VerticalAlignment="Top" Width="794" Foreground="White">
2 <Grid>
3
4 ?</Grid>
5 </GroupBox> 第二個Grid行里放置動畫處理所用到的Image和進度條: <Canvas Grid.Row="1" HorizontalAlignment="Left" Name="canvas1" VerticalAlignment="Top" Height="334" Width="778">
<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"/> 第三個Grid行里放置縮略圖列表控件: <ScrollViewer x:Name="scrolls" Margin="0,0,0,0" Grid.Row="2" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="110" Width="794" MouseLeave="scrolls_MouseLeave">
<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> 其中為了方便使縮略圖列表在有限的寬度內全部顯示,必須用橫向滾動條處理,外面放置ScrollViewer指定寬度:788px,并讓其顯示橫向滾動條。內置的StackPanel不設置寬度,使其根據內容自適應寬,如此以來便可以借助ScrollViewer的橫向滾動條瀏覽所有的縮略圖。
2、邏輯處理
當圖片處理操作啟動后,每個待處理的圖片都會從主區域以動畫從無到有地移動到最下方的縮略圖列表中:動畫開始——移動(透明度、大小,位置)——處理圖片切割——添加到縮略圖列表——下一個動畫開始。。。如此反復所有被選中的圖片。 3、數據初始化
處理選項設置了多個自定義,為了方便方便窗體選擇操作,所以構造了枚舉的集合以填充下拉列表,這里要進行選項列表與枚舉的轉。
(1)插補模式(InterpolationModeData):System.Drawing.Drawing2D.InterpolationMode 枚舉指定在縮放或旋轉圖像時使用的算法。 View Code 1 ///<summary>
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)呈現質量(SmoothingModeData):System.Drawing.Drawing2D. SmoothingMode 枚舉指定是否將平滑處理(抗鋸齒)應用于直線、曲線和已填充區域的邊緣。 View Code 1 ///<summary>
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 } (3)圖片處理方式(TailorTypeData):縮放:指定寬高(可能變形)、縮放:指定寬(高按比例)、縮放:指定高(寬按比例)、裁減:指定寬高。根據處理方式的不同決定是否必須填寫寬或高。 View Code 1 publicclass TailorTypeData
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 } (4)選擇圖片資源
由于要支持批量處理,所以在選擇待處理圖片的時候應該可以多選,并且設定在打開目錄窗口時只顯示圖片資源:*.jpg *.gif *.png。 1 System.Windows.Forms.OpenFileDialog ofd =new System.Windows.Forms.OpenFileDialog();
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纯手工两步打造图片切割工具(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Direct2D (25) : 将画笔线
- 下一篇: 算法导论9.2-3习题解答(寻找第i小的