C#实现图片切割、切图、裁剪

时间:2021-05-20

本文实例为大家分享了C#实现图片切割、切图的具体代码,供大家参考,具体内容如下

前台准备两个Image控件。上面是显示原图,下面显示切割后的效果。

<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>

对应的后台代码:

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; } }}

运行后的效果如下:

补充:关于剪裁的位置和区域的填写说明,如下图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章