您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān).NET圖片快速處理的幾種方法分別是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
這里首先要介紹一個(gè)類System.Drawing.Imaging.BitmapData,直接實(shí)例化這個(gè)類沒有用處,我們需要將一個(gè)Bitmap鎖定到內(nèi)存中,來(lái)獲取一個(gè)BitmapData的實(shí)例。.NET圖片快速處理方法如下:
使用Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)或者它的另一個(gè)重載Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)來(lái)將圖像數(shù)據(jù)鎖定到內(nèi)存中,以此來(lái)獲取一個(gè)與指定圖片相關(guān)聯(lián)的BitmapData實(shí)例。
在BitmapData中有一個(gè)重要的屬性Scan0,它是一個(gè)指針,指向了圖片數(shù)據(jù)所在內(nèi)存的***個(gè)位置。使用內(nèi)存跟蹤,將Scan0的值填入地址中,可以看到內(nèi)存的分配情況(Format32bppArgb顏色深度):
這些值與圖片像素的對(duì)應(yīng)關(guān)系是這樣的:
現(xiàn)在我們可以使用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法來(lái)更改指定位置的像素值了,修改后只要再調(diào)用一次Bitmap.UnlockBits(BitmapData bitmapdata)來(lái)解鎖內(nèi)存就可以了,例如:
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向量設(shè)置為255。運(yùn)行此實(shí)例可以看到圖片變色了。
每次調(diào)用System.Runtime.InteropServices.Marshal.WriteByte(IntPtr ptr, byte val)的方法并不方便,因此我們構(gòu)造一個(gè)ColorBgra類用來(lái)儲(chǔ)存這4個(gè)顏色向量,它的主要代碼是這樣的(參考自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; } }
使用這個(gè)類在聲明為unsafe的上下文中就可以通過(guò)計(jì)算偏移量的辦法尋址找到指定位置像素的地址(指針),例如在Format32bppArgb顏色深度的圖片中可以這樣計(jì)算:
public unsafe ColorBgra* GetPointAddress(int x, int y) { return y * 4 + x; }
將計(jì)算返回的指針賦給ColorBgra*。之后使用如下方法:
color->B = i; color ->G = i; color ->R = i; color ->A = i;
直接把值寫入內(nèi)存中,實(shí)現(xiàn).NET圖片快速處理操作。
以上就是.NET圖片快速處理的幾種方法分別是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。