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

運行后的效果如下:
這里寫圖片描述

補充:關於剪裁的位置和區域的填寫說明,如下圖。
這里寫圖片描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM