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

本文实例为大家分享了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;
 }
 }
}

运行后的效果如下:

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

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

(0)

相关推荐

  • C#自动类型转换与强制类型转换的讲解

    自动类型转换 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失.例如,从小的整数类型转换为大的整数类型,从派生类转换为基类. 转换规则 从存储范围小的类型到存储范围大的类型. 整数具体规则为: byte→short(char)→int→long→float→double 也就是说byte类型的变量可以自动转换为short类型,示例代码: byte b = 10; short sh = b; 在类型转换时可以跳跃.示例代码: byte b1 = 100; int

  • C#中实现伪静态页面两种方式介绍

    第一种是在页面global.asax中,相关代码如下: 复制代码 代码如下: void Application_BeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; string oldurl = context.Request.Path.ToLower(); if ( ( oldurl.IndexOf("-") > 0 &&a

  • C#网站生成静态页面的实例讲解

    在一些需要经常更新页面数据的网站中,一般访问量不是很大的都直接发布的是带后台代码,每次访问都是有数据库交互的.但是一旦访问量增加了,那么这些服务器开销变成本就要考虑进来了,像一些文章,后台编辑后,文章内容存入数据库,如果1000人访问,如果还是每次取数据库,那这1000次的io访问就显得比较大了,一个好的方法就是,文章确定之后,做成静态页面,而这个做的方法由程序来做,就是递归遍历整个网站,将网站内容都访问一遍,然后生成这些页面的静态文本页面,在将这些页面发布,这样对浏览者而言,他看到的还是同一个

  • C#实现动态生成静态页面的类详解

    本文实例讲述了C#实现动态生成静态页面的类.分享给大家供大家参考,具体如下: 动态生成静态页面有许多好处,比如生成html网页有利于被搜索引擎收录.同时,由于减少了数据访问,减轻对数据库访问的压力,提高了网页打开速度. 基本思路: 使用一个字符串作为页面模板,再页面中包含用若干标志(用 {标志名} 表示),生成页面时,将标志替换为对应的值. 实现方法: 在初始化TextTemplate实例时读入模板,以标志为分割点将模板分割成几部分,生成页面时只需简单的将模板内容和标志的值连接起来.例如: 假如

  • 解析在C#中接口和类的异同

    不同点: 不能直接实例化接口. 接口不包含方法的实现. 接口可以多继承,类只能单继承. 类定义可以在不同的源文件之间进行拆分. 相同点: 接口.类和结构都可以从多个接口继承. 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员. 接口和类都可以包含事件.索引器.属性. 接口只能定义方法. 1. 类 类的分类有:抽象类(abstract).密封类(sealed).静态类(static) 1.1 抽象类 关键字: abstract 使用目的:若所有子类拥有共同的特性,可以把这个特性

  • mongodb使用c#驱动数据插入demo

    Mongodb提供了多种开发语言的驱动,java,python,c++,c# 等,这里选用c#驱动作为测试: 首先上mongo官网下载驱动.Ps:官方网站经常连接不顺利. 还不如直接在vs的nuget管理包中搜索mongoDB.driver. 需要引入的命名空间: using MongoDB.Bson; using MongoDB.Driver; Driver是驱动核心,Bson是和数据格式相关的: 定义一个mongo客户端,一个mongodb,一个数据集合: protected staticI

  • C#用委托BeginInvoke做异步线程

    一个应用场景,浏览器上传一个文件,此文件后台调用文件转换,需要耗费相当长的时间,这样,如果是一个线程同步式的做下去,那么用户在浏览器上感觉就是卡住了,卡卡卡卡,这里我们利用委托的BeginInvoke和EndInvoke方法操作线程,BeginInvoke方法可以使用线程异步地执行委托所指向的方法.然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值就是被调用方法的返回值),或是确定方法已经被成功调用,说白了就是相当于开个多线程,你用户文件保存了之后,响应返回,这个Be

  • C# Winform实现石头剪刀布游戏

    本文实例为大家分享了Winform实现石头剪刀布游戏的具体代码,供大家参考,具体内容如下 新建一个windows窗体程序,用数字1代表石头,用数字2代表剪刀,用数字3代表布,结果取玩家和电脑出拳之差,有三种结果 玩家赢: -1,2 平手: 0 玩家输: 其它值 新建3个类: 1)Computer.cs 电脑随机出拳 using System; using System.Collections.Generic; using System.Linq; using System.Text; using

  • c#操作mongodb插入数据效率

    mongodb的数据插入速度是其一个亮点,同样的10000条数据,插入的速度要比Mysql和sqlserver都要快,当然这也是要看使用者怎么个使用法,你代码如果10000次写入使用10000次连接,那也是比不过其他数据库使用事务一次性提交的速度的. 同样,mongo也提供的一次性插入巨量数据的方法,因为mongodb没有事务这回事,所以在在C#驱动里,具体方法是InsertManyAsync()一次性插入多个文档.与之对应的是InsertOneAsync,这个是一次插入一个文档: Insert

  • C#引用类型和值类型的适用场合和区别

    1.值类型 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型. 值类型的变量直接存储数据,分配在托管栈中.变量会在创建它们的方法返回时自动释放. 所有的值类型都是密封(seal)的,所以无法派生出新的值类型. 2.引用类型 引用类型包括:数组,用户定义的类.接口.委托,object,字符串,null类型,类. 引用类型的变量持有的是数据的引用,数据存储在数据堆,分配在托管堆中,变量并不会在创建它们的方法结束时释放内存,它们所占用的内存会被CLR中的垃圾回收机制释放. C

随机推荐