温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

.NET图片快速处理的几种方法分别是什么

发布时间:2021-10-28 10:59:43 来源:亿速云 阅读:299 作者:柒染 栏目:编程语言

本篇文章给大家分享的是有关.NET图片快速处理的几种方法分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

这里首先要介绍一个类System.Drawing.Imaging.BitmapData,直接实例化这个类没有用处,我们需要将一个Bitmap锁定到内存中,来获取一个BitmapData的实例。.NET图片快速处理方法如下:

使用Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)或者它的另一个重载Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)来将图像数据锁定到内存中,以此来获取一个与指定图片相关联的BitmapData实例。

在BitmapData中有一个重要的属性Scan0,它是一个指针,指向了图片数据所在内存的***个位置。使用内存跟踪,将Scan0的值填入地址中,可以看到内存的分配情况(Format32bppArgb颜色深度):

.NET图片快速处理的几种方法分别是什么

这些值与图片像素的对应关系是这样的:

.NET图片快速处理的几种方法分别是什么

现在我们可以使用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法来更改指定位置的像素值了,修改后只要再调用一次Bitmap.UnlockBits(BitmapData bitmapdata)来解锁内存就可以了,例如:

private void LockUnlockBitsExample(PaintEventArgs e)  {  Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");  Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);  System.Drawing.Imaging.BitmapData bmpbmpData =  bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,  bmp.PixelFormat);  IntPtr ptr = bmpData.Scan0;  int bytes = bmp.Width * bmp.Height * 3;  byte[] rgbValues = new byte[bytes];  for (int counter = 0; counter < rgbValues.Length; counter += 3)  {  Marshal.WriteByte(ptr, counter, 255);  }  bmp.UnlockBits(bmpData);  e.Graphics.DrawImage(bmp, 0, 0);  }

此.NET图片快速处理示例将图片上所有像素的Red向量设置为255。运行此实例可以看到图片变色了。

每次调用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法并不方便,因此我们构造一个ColorBgra类用来储存这4个颜色向量,它的主要代码是这样的(参考自Paint.Net提供的源码):

[StructLayout(LayoutKind.Explicit)]  public struct ColorBgra  {  [FieldOffset(0)]  public byte B;     [FieldOffset(1)]  public byte G;     [FieldOffset(2)]  public byte R;     [FieldOffset(3)]  public byte A;   /// <summary> /// Lets you change B, G, R, and A at the same time.  /// </summary> [FieldOffset(0)]  public uint Bgra;  public override string ToString()  {  return "B: " + B + ", G: " + G + ", R: " + R + ", A: " + A;  }  }

使用这个类在声明为unsafe的上下文中就可以通过计算偏移量的办法寻址找到指定位置像素的地址(指针),例如在Format32bppArgb颜色深度的图片中可以这样计算:

public unsafe ColorBgra* GetPointAddress(int x, int y)  {  return y * 4 + x;  }

将计算返回的指针赋给ColorBgra*。之后使用如下方法:

color->B = i;  color ->G = i;  color ->R = i;  color ->A = i;

直接把值写入内存中,实现.NET图片快速处理操作。

以上就是.NET图片快速处理的几种方法分别是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI