九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
【C#】加快Bitmap的訪問速度
 
 

在對Bitmap圖片操作的時候,有時需要用到獲取或設(shè)置像素顏色方法:GetPixel 和 SetPixel,

如果直接對這兩個方法進(jìn)行操作的話速度很慢,這里我們可以通過把數(shù)據(jù)提取出來操作,然后操作完在復(fù)制回去可以加快訪問速度

其實(shí)對Bitmap的訪問還有兩種方式,一種是內(nèi)存法,一種是指針法

1、內(nèi)存法

  這里定義一個類LockBitmap,通過把Bitmap數(shù)據(jù)拷貝出來,在內(nèi)存上直接操作,操作完成后在拷貝到Bitmap中


public class LockBitmap        {            Bitmap source = null;            IntPtr Iptr = IntPtr.Zero;            BitmapData bitmapData = null;            public byte[] Pixels { get; set; }            public int Depth { get; private set; }            public int Width { get; private set; }            public int Height { get; private set; }            public LockBitmap(Bitmap source)            {                this.source = source;            }            /// <summary>            /// Lock bitmap data            /// </summary>            public void LockBits()            {                try                {                    // Get width and height of bitmap                    Width = source.Width;                    Height = source.Height;                    // get total locked pixels count                    int PixelCount = Width * Height;                    // Create rectangle to lock                    Rectangle rect = new Rectangle(0, 0, Width, Height);                    // get source bitmap pixel format size                    Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);                    // Check if bpp (Bits Per Pixel) is 8, 24, or 32                    if (Depth != 8 && Depth != 24 && Depth != 32)                    {                        throw new ArgumentException("Only 8, 24 and 32 bpp images are supported.");                    }                    // Lock bitmap and return bitmap data                    bitmapData = source.LockBits(rect, ImageLockMode.ReadWrite,                                                 source.PixelFormat);                    // create byte array to copy pixel values                    int step = Depth / 8;                    Pixels = new byte[PixelCount * step];                    Iptr = bitmapData.Scan0;                    // Copy data from pointer to array                    Marshal.Copy(Iptr, Pixels, 0, Pixels.Length);                }                catch (Exception ex)                {                    throw ex;                }            }            /// <summary>            /// Unlock bitmap data            /// </summary>            public void UnlockBits()            {                try                {                    // Copy data from byte array to pointer                    Marshal.Copy(Pixels, 0, Iptr, Pixels.Length);                    // Unlock bitmap data                    source.UnlockBits(bitmapData);                }                catch (Exception ex)                {                    throw ex;                }            }            /// <summary>            /// Get the color of the specified pixel            /// </summary>            /// <param name="x"></param>            /// <param name="y"></param>            /// <returns></returns>            public Color GetPixel(int x, int y)            {                Color clr = Color.Empty;                // Get color components count                int cCount = Depth / 8;                // Get start index of the specified pixel                int i = ((y * Width) + x) * cCount;                if (i > Pixels.Length - cCount)                    throw new IndexOutOfRangeException();                if (Depth == 32) // For 32 bpp get Red, Green, Blue and Alpha                {                    byte b = Pixels[i];                    byte g = Pixels[i + 1];                    byte r = Pixels[i + 2];                    byte a = Pixels[i + 3]; // a                    clr = Color.FromArgb(a, r, g, b);                }                if (Depth == 24) // For 24 bpp get Red, Green and Blue                {                    byte b = Pixels[i];                    byte g = Pixels[i + 1];                    byte r = Pixels[i + 2];                    clr = Color.FromArgb(r, g, b);                }                if (Depth == 8)                // For 8 bpp get color value (Red, Green and Blue values are the same)                {                    byte c = Pixels[i];                    clr = Color.FromArgb(c, c, c);                }                return clr;            }            /// <summary>            /// Set the color of the specified pixel            /// </summary>            /// <param name="x"></param>            /// <param name="y"></param>            /// <param name="color"></param>            public void SetPixel(int x, int y, Color color)            {                // Get color components count                int cCount = Depth / 8;                // Get start index of the specified pixel                int i = ((y * Width) + x) * cCount;                if (Depth == 32) // For 32 bpp set Red, Green, Blue and Alpha                {                    Pixels[i] = color.B;                    Pixels[i + 1] = color.G;                    Pixels[i + 2] = color.R;                    Pixels[i + 3] = color.A;                }                if (Depth == 24) // For 24 bpp set Red, Green and Blue                {                    Pixels[i] = color.B;                    Pixels[i + 1] = color.G;                    Pixels[i + 2] = color.R;                }                if (Depth == 8)                // For 8 bpp set color value (Red, Green and Blue values are the same)                {                    Pixels[i] = color.B;                }            }        }

使用:先鎖定Bitmap,然后通過Pixels操作顏色對象,最后釋放鎖,把數(shù)據(jù)更新到Bitmap中


string file = @"C:\test.jpg";            Bitmap bmp = new Bitmap(Image.FromFile(file));                        LockBitmap lockbmp = new LockBitmap(bmp);            //鎖定Bitmap,通過Pixel訪問顏色            lockbmp.LockBits();            //獲取顏色            Color color = lockbmp.GetPixel(10, 10);            //從內(nèi)存解鎖Bitmap            lockbmp.UnlockBits();

2、指針法

  這種方法訪問速度比內(nèi)存法更快,直接通過指針對內(nèi)存進(jìn)行操作,不需要進(jìn)行拷貝,但是在C#中直接通過指針操作內(nèi)存是不安全的,所以需要在代碼中加入unsafe關(guān)鍵字,在生成選項(xiàng)中把允許不安全代碼勾上,才能編譯通過

  這里定義成PointerBitmap類


public class PointBitmap            {                Bitmap source = null;                IntPtr Iptr = IntPtr.Zero;                BitmapData bitmapData = null;                public int Depth { get; private set; }                public int Width { get; private set; }                public int Height { get; private set; }                public PointBitmap(Bitmap source)                {                    this.source = source;                }                public void LockBits()                {                    try                    {                        // Get width and height of bitmap                        Width = source.Width;                        Height = source.Height;                        // get total locked pixels count                        int PixelCount = Width * Height;                        // Create rectangle to lock                        Rectangle rect = new Rectangle(0, 0, Width, Height);                        // get source bitmap pixel format size                        Depth = System.Drawing.Bitmap.GetPixelFormatSize(source.PixelFormat);                        // Check if bpp (Bits Per Pixel) is 8, 24, or 32                        if (Depth != 8 && Depth != 24 && Depth != 32)                        {                            throw new ArgumentException("Only 8, 24 and 32 bpp images are supported.");                        }                        // Lock bitmap and return bitmap data                        bitmapData = source.LockBits(rect, ImageLockMode.ReadWrite,                                                     source.PixelFormat);                        //得到首地址                        unsafe                        {                            Iptr = bitmapData.Scan0;                            //二維圖像循環(huán)                                                    }                    }                    catch (Exception ex)                    {                        throw ex;                    }                }                public void UnlockBits()                {                    try                    {                        source.UnlockBits(bitmapData);                    }                    catch (Exception ex)                    {                        throw ex;                    }                }                public Color GetPixel(int x, int y)                {                    unsafe                    {                        byte* ptr = (byte*)Iptr;                        ptr = ptr + bitmapData.Stride * y;                        ptr += Depth * x / 8;                        Color c = Color.Empty;                        if (Depth == 32)                        {                            int a = ptr[3];                            int r = ptr[2];                            int g = ptr[1];                            int b = ptr[0];                            c = Color.FromArgb(a, r, g, b);                        }                        else if (Depth == 24)                        {                            int r = ptr[2];                            int g = ptr[1];                            int b = ptr[0];                            c = Color.FromArgb(r, g, b);                        }                        else if (Depth == 8)                        {                            int r = ptr[0];                            c = Color.FromArgb(r, r, r);                        }                        return c;                    }                }                public void SetPixel(int x, int y, Color c)                {                    unsafe                    {                        byte* ptr = (byte*)Iptr;                        ptr = ptr + bitmapData.Stride * y;                        ptr += Depth * x / 8;                        if (Depth == 32)                        {                            ptr[3] = c.A;                            ptr[2] = c.R;                            ptr[1] = c.G;                            ptr[0] = c.B;                        }                        else if (Depth == 24)                        {                            ptr[2] = c.R;                            ptr[1] = c.G;                            ptr[0] = c.B;                        }                        else if (Depth == 8)                        {                            ptr[2] = c.R;                            ptr[1] = c.G;                            ptr[0] = c.B;                        }                    }                }            }

使用方法這里就不列出來了,跟上面的LockBitmap類似

 
 

以上圖片由“圖斗羅”提供

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
bitmap的圖像像素遍歷方法
C#中保存GIF文件后透明背景問題的一個解決方法
c# 24位圖像轉(zhuǎn)8位灰度圖像(數(shù)組方式)
C#數(shù)字圖像處理的3種方法
C#圖片處理常見方法性能比較
OpenCv,EmguCv及.net之間的互動(The Interaction of OpenCv, EmguCv AND .net)
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服