C#实现图片切割、切图、裁剪
本文实例为大家分享了C#实现图片切割、切图的具体代码,供大家参考,具体内容如下
前台准备两个Image控件。上面是显示原图,下面显示切割后的效果。
1
2
3
4
|
<StackPanel Orientation= "Vertical" > <Image Width= "450" Height= "383" Source= "C:\Users\Administrator\Documents\Visual Studio 2015\Projects\SplitPic\SplitPic\Images\1.jpg" /> <Image x:Name= "img" Stretch= "None" Width= "450" Height= "383" /> </StackPanel> |
对应的后台代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 设置原图 img.Source = new BitmapImage( new Uri( @"Images/1.jpg" , UriKind.Relative)); // 切割图片 ImageSource imageSource = img.Source; Bitmap bitmap = SystemUtils.ImageSourceToBitmap(imageSource); BitmapSource bitmapSource = SystemUtils.BitmapToBitmapImage(bitmap); BitmapSource newBitmapSource = SystemUtils.CutImage(bitmapSource, new Int32Rect(125, 60, 235, 285)); // 使用切割后的图源 img.Source = newBitmapSource; } } // 图像工具类 public static class SystemUtils { /// <summary> /// 切图 /// </summary> /// <param name="bitmapSource">图源</param> /// <param name="cut">切割区域</param> /// <returns></returns> public static BitmapSource CutImage(BitmapSource bitmapSource, Int32Rect cut) { //计算Stride var stride = bitmapSource.Format.BitsPerPixel * cut.Width / 8; //声明字节数组 byte [] data = new byte [cut.Height * stride]; //调用CopyPixels bitmapSource.CopyPixels(cut, data, stride, 0); return BitmapSource.Create(cut.Width, cut.Height, 0, 0, PixelFormats.Bgr32, null , data, stride); } // ImageSource --> Bitmap public static System.Drawing.Bitmap ImageSourceToBitmap(ImageSource imageSource) { BitmapSource m = (BitmapSource)imageSource; System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(m.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); System.Drawing.Imaging.BitmapData data = bmp.LockBits( new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); m.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBits(data); return bmp; } // Bitmap --> BitmapImage public static BitmapImage BitmapToBitmapImage(Bitmap bitmap) { using (MemoryStream stream = new MemoryStream()) { bitmap.Save(stream, ImageFormat.Bmp); stream.Position = 0; BitmapImage result = new BitmapImage(); result.BeginInit(); // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed." // Force the bitmap to load right now so we can dispose the stream. result.CacheOption = BitmapCacheOption.OnLoad; result.StreamSource = stream; result.EndInit(); result.Freeze(); return result; } } } |
运行后的效果如下:
补充:关于剪裁的位置和区域的填写说明,如下图。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
https://www.jb51.net/article/154612.htm