C# 圖檔RGB處理判斷
需要:根據一張原始圖的RGB平均值和新的圖檔的RGB平均值的差距,來判斷圖中是否出現除原圖中物體外的其他物體
前提:.Net framework 4.8 及以上
示例代碼:
程式集:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
主體代碼:
public static bool CheckRGBAvg(Bitmap srcBitmap, int avgRed, int avgGreen, int avgBlue, out Color color, int offset = 20)
{
int wide = srcBitmap.Width;
int height = srcBitmap.Height;
Rectangle rect = new Rectangle(0, 0, wide, height);
//将Bitmap鎖定到系統記憶體中,獲得BitmapData
BitmapData srcBmData = srcBitmap.LockBits(rect,
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
//位圖中第一個像素資料的位址。它也可以看成是位圖中的第一個掃描行
System.IntPtr srcPtr = srcBmData.Scan0;
//将Bitmap對象的資訊存放到byte數組中
int src_bytes = srcBmData.Stride * height;
byte[] srcValues = new byte[src_bytes];
//複制GRB資訊到byte數組
System.Runtime.InteropServices.Marshal.Copy(srcPtr, srcValues, 0, src_bytes);
//根據Y=0.299*R+0.114*G+0.587B,Y為亮度
int r = 0;
int g = 0;
int b = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < wide; j++)
{
//隻處理每行中圖像像素資料,舍棄未用空間
//注意位圖結構中RGB按BGR的順序存儲
int k = 3 * j;
r += srcValues[i * srcBmData.Stride + k + 2];
b += srcValues[i * srcBmData.Stride + k];
g += srcValues[i * srcBmData.Stride + k + 1];
}
}
//解鎖位圖
srcBitmap.UnlockBits(srcBmData);
double avgR = r * 1.0 / height / wide;
double avgG = g * 1.0 / height / wide;
double avgB = b * 1.0 / height / wide;
if (Math.Abs(avgB - avgBlue) <= offset && Math.Abs(avgG - avgGreen) <= offset && Math.Abs(avgR - avgRed) <= offset)
{
return true;
}
else
{
return false;
}
}
note:
方法需要傳入新的圖檔對象(Bitmap),原圖的标準RGB平均值,新圖的RGB顔色,新圖和原圖的RGB相差偏移量。
傳回新圖的RGB平均值是否在原圖的RGB平均值偏移量之内。