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

简介: 原文:【C#/WPF】图片的切割/切图/裁剪图片 前台准备两个Image控件。上面是显示原图,下面显示切割后的效果。 对应的后台代码: public par...
原文: 【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;
        }
    }
}

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

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

目录
相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
116 3
|
3月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
78 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
67 0
|
3月前
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
67 0
|
3月前
|
前端开发 C# Windows
WPF/C#:如何实现拖拉元素
WPF/C#:如何实现拖拉元素
51 0
|
3月前
|
存储 C# 索引
WPF/C#:BusinessLayerValidation
WPF/C#:BusinessLayerValidation
33 0
|
3月前
|
C#
WPF/C#:数据绑定到方法
WPF/C#:数据绑定到方法
42 0
|
3月前
|
前端开发 测试技术 C#
WPF/C#:在DataGrid中显示选择框
WPF/C#:在DataGrid中显示选择框
58 0