1. 程式人生 > >【C#/WPF】圖片的切割/切圖/裁剪圖片

【C#/WPF】圖片的切割/切圖/裁剪圖片

height pre template urn sin ati ttr panel raw

原文:【C#/WPF】圖片的切割/切圖/裁剪圖片

前臺準備兩個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; } } }

運行後的效果如下:
技術分享圖片

補充:關於剪裁的位置和區域的填寫說明,如下圖。
技術分享圖片

【C#/WPF】圖片的切割/切圖/裁剪圖片