zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    给XML文件定义DTD
    详探TextRange对象用execCommand()执行命令
    获取屏幕,浏览器,网页高度宽度
    花点时间搞清top、postop、scrolltop、scrollHeight、offsetHeight
    DataView数据组件
    回调实现无刷新级联下拉框(.net)
    ASP.NET的简单数据绑定
    详探TextRange对象查找与选择
    方维系统常用的jquery库以及各个库的含义
    方维购物分享系统 给店铺品牌加喜欢收藏的功能
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12735764.html
Copyright © 2011-2022 走看看