C# 获取图像像素

第一种方法:

 1  public static byte[] GetImagePixel(Bitmap img)
 2 {
 3             byte[] result = new byte[img.Width*img.Height*3];
 4             int n = 0;
 5             for (int i = 0; i < img.Height; i++)
 6             {
 7                 for (int j = 0; j < img.Width; j++)
 8                 {
 9                    result[n] =  img.GetPixel(i ,j).R;
10                    result[n+1] = img.GetPixel(i, j).G;
11                    result[n+2] = img.GetPixel(i, j).B;
12                    n += 3;
13                 }
14             }
15             return result;
16 }

第二种方法:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Drawing;
  5 using System.Drawing.Imaging;
  6 
  7 namespace ImageCompare
  8 {
  9     public unsafe class UnsafeBitmap
 10     {
 11         Bitmap bitmap;
 12 
 13         // three elements used for MakeGreyUnsafe
 14         int width;
 15         BitmapData bitmapData = null;
 16         Byte* pBase = null;
 17 
 18         public UnsafeBitmap(Bitmap bitmap)
 19         {
 20             this.bitmap = new Bitmap(bitmap);
 21         }
 22 
 23         public UnsafeBitmap(int width, int height)
 24         {
 25             this.bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
 26         }
 27 
 28         public void Dispose()
 29         {
 30             bitmap.Dispose();
 31         }
 32 
 33         public Bitmap Bitmap
 34         {
 35             get
 36             {
 37                 return (bitmap);
 38             }
 39         }
 40 
 41         private Point PixelSize
 42         {
 43             get
 44             {
 45                 GraphicsUnit unit = GraphicsUnit.Pixel;
 46                 RectangleF bounds = bitmap.GetBounds(ref unit);
 47 
 48                 return new Point((int)bounds.Width, (int)bounds.Height);
 49             }
 50         }
 51 
 52         public void LockBitmap()
 53         {
 54             GraphicsUnit unit = GraphicsUnit.Pixel;
 55             RectangleF boundsF = bitmap.GetBounds(ref unit);
 56             Rectangle bounds = new Rectangle((int)boundsF.X,
 57           (int)boundsF.Y,
 58           (int)boundsF.Width,
 59           (int)boundsF.Height);
 60 
 61             // Figure out the number of bytes in a row
 62             // This is rounded up to be a multiple of 4
 63             // bytes, since a scan line in an image must always be a multiple of 4 bytes
 64             // in length. 
 65             width = (int)boundsF.Width * sizeof(PixelData);
 66             if (width % 4 != 0)
 67             {
 68                 width = 4 * (width / 4 + 1);
 69             }
 70             bitmapData =
 71           bitmap.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
 72 
 73             pBase = (Byte*)bitmapData.Scan0.ToPointer();
 74         }
 75 
 76         public PixelData GetPixel(int x, int y)
 77         {
 78             PixelData returnValue = *PixelAt(x, y);
 79             return returnValue;
 80         }
 81 
 82         public void SetPixel(int x, int y, PixelData colour)
 83         {
 84             PixelData* pixel = PixelAt(x, y);
 85             *pixel = colour;
 86         }
 87 
 88         public void UnlockBitmap()
 89         {
 90             bitmap.UnlockBits(bitmapData);
 91             bitmapData = null;
 92             pBase = null;
 93         }
 94         public PixelData* PixelAt(int x, int y)
 95         {
 96             return (PixelData*)(pBase + y * width + x * sizeof(PixelData));
 97         }
 98     }
 99     public struct PixelData
100     {
101         public byte blue;
102         public byte green;
103         public byte red;
104     }
105 }
106 
107 
108 public static byte[] GetUnsafeImagePixel(Bitmap img)
109 {
110             byte[] result = new byte[img.Width * img.Height * 3];
111             int n = 0;
112             UnsafeBitmap unsafeBitmap = new UnsafeBitmap(img);
113             unsafeBitmap.LockBitmap();
114             int x = 0, y = 0;
115             do
116             {
117                 for (x = 0; x < img.Width; x++)
118                 {
119                    PixelData pixel = unsafeBitmap.GetPixel(x,y);
120                    result[n] = pixel.red;
121                    result[n + 1] = pixel.green;
122                    result[n + 2] = pixel.blue;
123                    n += 3;
124                 }
125                 y++;
126             } while (y!=img.Height);
127             unsafeBitmap.UnlockBitmap();
128             return result;
129  
130 }

第三种速度最快:

 1 public static unsafe byte[] ConvertTo8Byte(Bitmap img)
 2 {
 3    byte[] result = new byte[img.Width*img.Height];
 4     int n = 0;
 5     BitmapData data = img.LockBits(new Rectangle(0, 0, img.Width, img.Height), ImageLockMode.ReadOnly,
 6                                    PixelFormat.Format24bppRgb);
 7     var bp = (byte*)data.Scan0.ToPointer();
 8    
 9     for (int i = 0; i != data.Height; i++)
10     {
11         for (int j = 0; j != data.Width; j++)
12         {
13             result[n] = bp[i * data.Stride + j * 3];
14             n++;
15             //0.3R+0.59G+0.11B
16             //float value = 0.11F * bp[i * data.Stride + j * 3] + 0.59F * bp[i * data.Stride + j * 3 + 1] +
17             //              0.3F * bp[i * data.Stride + j * 3 + 2];
18            
19         }
20     }
21     img.UnlockBits(data);
22     //img.Dispose();
23     return result;
24    // ColorPalette palette = bit.Palette;
25     //for (int i = 0; i != palette.Entries.Length; i++)
26     //{
27     //    palette.Entries[i] = Color.FromArgb(i, i, i);
28     //}
29     //bit.Palette = palette;
30     //bit.Save(destFile, ImageFormat.Bmp);
31     //img.Dispose();
32     //bit.Dispose();
33 }

 

C# 获取图像像素

上一篇:C#取汉字首字母,汉字全拼


下一篇:LeetCode之Candy