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

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

<StackPanel Orientation="Vertical">
    <Image Width="450" Height="383" Source="C:UsersAdministratorDocumentsVisual Studio 2015ProjectsSplitPicSplitPicImages1.jpg"/>
    <Image x:Name="img" Stretch="None" Width="450" Height="383" />
</StackPanel>

对应的后台代码:

public partial class MainWindow : Window
{
    public MainWindow)
    {
        InitializeComponent);

        // 设置原图
        img.Source = new BitmapImagenew Uri@"Images/1.jpg", UriKind.Relative));

        // 切割图片
        ImageSource imageSource = img.Source;
        Bitmap bitmap = SystemUtils.ImageSourceToBitmapimageSource);
        BitmapSource bitmapSource = SystemUtils.BitmapToBitmapImagebitmap);
        BitmapSource newBitmapSource = SystemUtils.CutImagebitmapSource, new Int32Rect125, 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 CutImageBitmapSource bitmapSource, Int32Rect cut)
    {
        //计算Stride
        var stride = bitmapSource.Format.BitsPerPixel * cut.Width / 8;
        //声明字节数组
        byte[] data = new byte[cut.Height * stride];
        //调用CopyPixels
        bitmapSource.CopyPixelscut, data, stride, 0);

        return BitmapSource.Createcut.Width, cut.Height, 0, 0, PixelFormats.Bgr32, null, data, stride);
    }

    // ImageSource --> Bitmap
    public static System.Drawing.Bitmap ImageSourceToBitmapImageSource imageSource)
    {
        BitmapSource m = BitmapSource)imageSource;

        System.Drawing.Bitmap bmp = new System.Drawing.Bitmapm.PixelWidth, m.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

        System.Drawing.Imaging.BitmapData data = bmp.LockBits
        new System.Drawing.RectangleSystem.Drawing.Point.Empty, bmp.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

        m.CopyPixelsInt32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride); bmp.UnlockBitsdata);

        return bmp;
    }

    // Bitmap --> BitmapImage
    public static BitmapImage BitmapToBitmapImageBitmap bitmap)
    {
        using MemoryStream stream = new MemoryStream))
        {
            bitmap.Savestream, 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;
        }
    }
}

运行后的效果如下:
这里写图片描述

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注