c# 获取图像像素

第一种方法:

 public static byte[] GetImagePixel(Bitmap img)
        {
            byte[] result = new byte[img.Width*img.Height*3];
            int n = 0;
            for (int i = 0; i < img.Height; i++)
            {
                for (int j = 0; j < img.Width; j++)
                {
                   result[n] =  img.GetPixel(i ,j).R;
                   result[n+1] = img.GetPixel(i, j).G;
                   result[n+2] = img.GetPixel(i, j).B;
                   n += 3;
                }
            }
            return result;
        }

第二种方法:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace ImageCompare
{
    public unsafe class UnsafeBitmap
    {
        Bitmap bitmap;

        // three elements used for MakeGreyUnsafe
        int width;
        BitmapData bitmapData = null;
        Byte* pBase = null;

        public UnsafeBitmap(Bitmap bitmap)
        {
            this.bitmap = new Bitmap(bitmap);
        }

        public UnsafeBitmap(int width, int height)
        {
            this.bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
        }

        public void Dispose()
        {
            bitmap.Dispose();
        }

        public Bitmap Bitmap
        {
            get
            {
                return (bitmap);
            }
        }

        private Point PixelSize
        {
            get
            {
                GraphicsUnit unit = GraphicsUnit.Pixel;
                RectangleF bounds = bitmap.GetBounds(ref unit);

                return new Point((int)bounds.Width, (int)bounds.Height);
            }
        }

        public void LockBitmap()
        {
            GraphicsUnit unit = GraphicsUnit.Pixel;
            RectangleF boundsF = bitmap.GetBounds(ref unit);
            Rectangle bounds = new Rectangle((int)boundsF.X,
          (int)boundsF.Y,
          (int)boundsF.Width,
          (int)boundsF.Height);

            // Figure out the number of bytes in a row
            // This is rounded up to be a multiple of 4
            // bytes, since a scan line in an image must always be a multiple of 4 bytes
            // in length. 
            width = (int)boundsF.Width * sizeof(PixelData);
            if (width % 4 != 0)
            {
                width = 4 * (width / 4 + 1);
            }
            bitmapData =
          bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            pBase = (Byte*)bitmapData.Scan0.ToPointer();
        }

        public PixelData GetPixel(int x, int y)
        {
            PixelData returnValue = *PixelAt(x, y);
            return returnValue;
        }

        public void SetPixel(int x, int y, PixelData colour)
        {
            PixelData* pixel = PixelAt(x, y);
            *pixel = colour;
        }

        public void UnlockBitmap()
        {
            bitmap.UnlockBits(bitmapData);
            bitmapData = null;
            pBase = null;
        }
        public PixelData* PixelAt(int x, int y)
        {
            return (PixelData*)(pBase + y * width + x * sizeof(PixelData));
        }
    }
    public struct PixelData
    {
        public byte blue;
        public byte green;
        public byte red;
    }
}


public static byte[] GetUnsafeImagePixel(Bitmap img)
        {
            byte[] result = new byte[img.Width * img.Height * 3];
            int n = 0;
            UnsafeBitmap unsafeBitmap = new UnsafeBitmap(img);
            unsafeBitmap.LockBitmap();
            int x = 0, y = 0;
            do
            {
                for (x = 0; x < img.Width; x++)
                {
                   PixelData pixel = unsafeBitmap.GetPixel(x,y);
                   result[n] = pixel.red;
                   result[n + 1] = pixel.green;
                   result[n + 2] = pixel.blue;
                   n += 3;
                }
                y++;
            } while (y!=img.Height);
            unsafeBitmap.UnlockBitmap();
            return result;
 
        }

第三种速度最快:

public static unsafe byte[] ConvertTo8Byte(Bitmap img)
{
   byte[] result = new byte[img.Width*img.Height];
    int n = 0;
    BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly,
                                   PixelFormat.Format24bppRgb);
    var bp = (byte*)data.Scan0.ToPointer();
   
    for (int i = 0; i != data.Height; i++)
    {
        for (int j = 0; j != data.Width; j++)
        {
            result[n] = bp[i * data.Stride + j * 3];
            n++;
            //0.3R+0.59G+0.11B
            //float value = 0.11F * bp[i * data.Stride + j * 3] + 0.59F * bp[i * data.Stride + j * 3 + 1] +
            //              0.3F * bp[i * data.Stride + j * 3 + 2];
           
        }
    }
    img.UnlockBits(data);
    //img.Dispose();
    return result;
   // ColorPalette palette = bit.Palette;
    //for (int i = 0; i != palette.Entries.Length; i++)
    //{
    //    palette.Entries[i] = Color.FromArgb(i, i, i);
    //}
    //bit.Palette = palette;
    //bit.Save(destFile, ImageFormat.Bmp);
    //img.Dispose();
    //bit.Dispose();
}
原文地址:https://www.cnblogs.com/liuxinls/p/3090850.html