261 lines
8.4 KiB
C#
261 lines
8.4 KiB
C#
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using AForge.Math;
|
|
|
|
namespace AForge.Imaging;
|
|
|
|
public class VerticalIntensityStatistics
|
|
{
|
|
private Histogram red;
|
|
|
|
private Histogram green;
|
|
|
|
private Histogram blue;
|
|
|
|
private Histogram gray;
|
|
|
|
public Histogram Red
|
|
{
|
|
get
|
|
{
|
|
if (red == null)
|
|
{
|
|
throw new InvalidImagePropertiesException("Cannot access color histogram since the last processed image was grayscale.");
|
|
}
|
|
return red;
|
|
}
|
|
}
|
|
|
|
public Histogram Green
|
|
{
|
|
get
|
|
{
|
|
if (green == null)
|
|
{
|
|
throw new InvalidImagePropertiesException("Cannot access color histogram since the last processed image was grayscale.");
|
|
}
|
|
return green;
|
|
}
|
|
}
|
|
|
|
public Histogram Blue
|
|
{
|
|
get
|
|
{
|
|
if (blue == null)
|
|
{
|
|
throw new InvalidImagePropertiesException("Cannot access color histogram since the last processed image was grayscale.");
|
|
}
|
|
return blue;
|
|
}
|
|
}
|
|
|
|
public Histogram Gray
|
|
{
|
|
get
|
|
{
|
|
if (gray == null)
|
|
{
|
|
throw new InvalidImagePropertiesException("Cannot access gray histogram since the last processed image was color.");
|
|
}
|
|
return gray;
|
|
}
|
|
}
|
|
|
|
public bool IsGrayscale => gray != null;
|
|
|
|
public VerticalIntensityStatistics(Bitmap image)
|
|
{
|
|
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0011: Invalid comparison between Unknown and I4
|
|
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_001e: Invalid comparison between Unknown and I4
|
|
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_002b: Invalid comparison between Unknown and I4
|
|
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0038: Invalid comparison between Unknown and I4
|
|
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0045: Invalid comparison between Unknown and I4
|
|
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0052: Invalid comparison between Unknown and I4
|
|
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_005f: Invalid comparison between Unknown and I4
|
|
if ((int)((Image)image).PixelFormat != 198659 && (int)((Image)image).PixelFormat != 1052676 && (int)((Image)image).PixelFormat != 137224 && (int)((Image)image).PixelFormat != 139273 && (int)((Image)image).PixelFormat != 2498570 && (int)((Image)image).PixelFormat != 1060876 && (int)((Image)image).PixelFormat != 3424269)
|
|
{
|
|
throw new UnsupportedImageFormatException("Unsupported pixel format of the source image.");
|
|
}
|
|
BitmapData val = image.LockBits(new Rectangle(0, 0, ((Image)image).Width, ((Image)image).Height), (ImageLockMode)1, ((Image)image).PixelFormat);
|
|
try
|
|
{
|
|
ProcessImage(new UnmanagedImage(val));
|
|
}
|
|
finally
|
|
{
|
|
image.UnlockBits(val);
|
|
}
|
|
}
|
|
|
|
public VerticalIntensityStatistics(BitmapData imageData)
|
|
: this(new UnmanagedImage(imageData))
|
|
{
|
|
}
|
|
|
|
public VerticalIntensityStatistics(UnmanagedImage image)
|
|
{
|
|
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0011: Invalid comparison between Unknown and I4
|
|
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_001e: Invalid comparison between Unknown and I4
|
|
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_002b: Invalid comparison between Unknown and I4
|
|
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0038: Invalid comparison between Unknown and I4
|
|
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0045: Invalid comparison between Unknown and I4
|
|
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0052: Invalid comparison between Unknown and I4
|
|
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_005f: Invalid comparison between Unknown and I4
|
|
if ((int)image.PixelFormat != 198659 && (int)image.PixelFormat != 1052676 && (int)image.PixelFormat != 137224 && (int)image.PixelFormat != 139273 && (int)image.PixelFormat != 2498570 && (int)image.PixelFormat != 1060876 && (int)image.PixelFormat != 3424269)
|
|
{
|
|
throw new UnsupportedImageFormatException("Unsupported pixel format of the source image.");
|
|
}
|
|
ProcessImage(image);
|
|
}
|
|
|
|
private unsafe void ProcessImage(UnmanagedImage image)
|
|
{
|
|
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0043: Invalid comparison between Unknown and I4
|
|
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_00b6: Invalid comparison between Unknown and I4
|
|
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0131: Invalid comparison between Unknown and I4
|
|
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_015d: Invalid comparison between Unknown and I4
|
|
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0139: Invalid comparison between Unknown and I4
|
|
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0141: Invalid comparison between Unknown and I4
|
|
//IL_021c: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_0222: Invalid comparison between Unknown and I4
|
|
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_024e: Invalid comparison between Unknown and I4
|
|
//IL_0224: Unknown result type (might be due to invalid IL or missing references)
|
|
//IL_022a: Invalid comparison between Unknown and I4
|
|
PixelFormat pixelFormat = image.PixelFormat;
|
|
int width = image.Width;
|
|
int height = image.Height;
|
|
red = (green = (blue = (gray = null)));
|
|
if ((int)pixelFormat == 198659)
|
|
{
|
|
byte* ptr = (byte*)image.ImageData.ToPointer();
|
|
int num = image.Stride - width;
|
|
int[] array = new int[height];
|
|
for (int i = 0; i < height; i++)
|
|
{
|
|
int num2 = 0;
|
|
int num3 = 0;
|
|
while (num3 < width)
|
|
{
|
|
num2 += *ptr;
|
|
num3++;
|
|
ptr++;
|
|
}
|
|
array[i] = num2;
|
|
ptr += num;
|
|
}
|
|
gray = new Histogram(array);
|
|
}
|
|
else if ((int)pixelFormat == 1052676)
|
|
{
|
|
byte* ptr2 = (byte*)image.ImageData.ToPointer();
|
|
int stride = image.Stride;
|
|
int[] array2 = new int[height];
|
|
for (int j = 0; j < height; j++)
|
|
{
|
|
ushort* ptr3 = (ushort*)(ptr2 + (nint)stride * (nint)j);
|
|
int num4 = 0;
|
|
int num5 = 0;
|
|
while (num5 < width)
|
|
{
|
|
num4 += *ptr3;
|
|
num5++;
|
|
ptr3++;
|
|
}
|
|
array2[j] = num4;
|
|
}
|
|
gray = new Histogram(array2);
|
|
}
|
|
else if ((int)pixelFormat == 137224 || (int)pixelFormat == 139273 || (int)pixelFormat == 2498570)
|
|
{
|
|
byte* ptr4 = (byte*)image.ImageData.ToPointer();
|
|
int num6 = (((int)pixelFormat == 137224) ? 3 : 4);
|
|
int num7 = image.Stride - width * num6;
|
|
int[] array3 = new int[height];
|
|
int[] array4 = new int[height];
|
|
int[] array5 = new int[height];
|
|
for (int k = 0; k < height; k++)
|
|
{
|
|
int num8 = 0;
|
|
int num9 = 0;
|
|
int num10 = 0;
|
|
int num11 = 0;
|
|
while (num11 < width)
|
|
{
|
|
num8 += ptr4[2];
|
|
num9 += ptr4[1];
|
|
num10 += *ptr4;
|
|
num11++;
|
|
ptr4 += num6;
|
|
}
|
|
array3[k] = num8;
|
|
array4[k] = num9;
|
|
array5[k] = num10;
|
|
ptr4 += num7;
|
|
}
|
|
red = new Histogram(array3);
|
|
green = new Histogram(array4);
|
|
blue = new Histogram(array5);
|
|
}
|
|
else
|
|
{
|
|
if ((int)pixelFormat != 1060876 && (int)pixelFormat != 3424269)
|
|
{
|
|
return;
|
|
}
|
|
byte* ptr5 = (byte*)image.ImageData.ToPointer();
|
|
int stride2 = image.Stride;
|
|
int num12 = (((int)pixelFormat == 1060876) ? 3 : 4);
|
|
int[] array6 = new int[height];
|
|
int[] array7 = new int[height];
|
|
int[] array8 = new int[height];
|
|
for (int l = 0; l < height; l++)
|
|
{
|
|
ushort* ptr6 = (ushort*)(ptr5 + (nint)stride2 * (nint)l);
|
|
int num13 = 0;
|
|
int num14 = 0;
|
|
int num15 = 0;
|
|
int num16 = 0;
|
|
while (num16 < width)
|
|
{
|
|
num13 += ptr6[2];
|
|
num14 += ptr6[1];
|
|
num15 += *ptr6;
|
|
num16++;
|
|
ptr6 += num12;
|
|
}
|
|
array6[l] = num13;
|
|
array7[l] = num14;
|
|
array8[l] = num15;
|
|
}
|
|
red = new Histogram(array6);
|
|
green = new Histogram(array7);
|
|
blue = new Histogram(array8);
|
|
}
|
|
}
|
|
}
|