private unsafe void ProcessImage(UnmanagedImage image) { this.CheckSourceFormat(image.PixelFormat); int width = image.Width; int height = image.Height; this.pixels = this.pixelsWithoutBlack = 0; int[] numArray = new int[0x100]; int[] numArray2 = new int[0x100]; int[] numArray3 = new int[0x100]; int[] numArray4 = new int[0x100]; int[] numArray5 = new int[0x100]; int[] numArray6 = new int[0x100]; RGB rgb = new RGB(); YCbCr ycbcr = new YCbCr(); int num3 = (image.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; int num4 = image.Stride - (width * num3); byte *numPtr = (byte *)image.ImageData.ToPointer(); for (int i = 0; i < height; i++) { int num6 = 0; while (num6 < width) { rgb.Red = numPtr[2]; rgb.Green = numPtr[1]; rgb.Blue = numPtr[0]; YCbCr.FromRGB(rgb, ycbcr); numArray[(int)(ycbcr.Y * 255.0)]++; numArray2[(int)((ycbcr.Cb + 0.5) * 255.0)]++; numArray3[(int)((ycbcr.Cr + 0.5) * 255.0)]++; this.pixels++; if (((ycbcr.Y != 0.0) || (ycbcr.Cb != 0.0)) || (ycbcr.Cr != 0.0)) { numArray4[(int)(ycbcr.Y * 255.0)]++; numArray5[(int)((ycbcr.Cb + 0.5) * 255.0)]++; numArray6[(int)((ycbcr.Cr + 0.5) * 255.0)]++; this.pixelsWithoutBlack++; } num6++; numPtr += num3; } numPtr += num4; } this.yHistogram = new ContinuousHistogram(numArray, new DoubleRange(0.0, 1.0)); this.cbHistogram = new ContinuousHistogram(numArray2, new DoubleRange(-0.5, 0.5)); this.crHistogram = new ContinuousHistogram(numArray3, new DoubleRange(-0.5, 0.5)); this.yHistogramWithoutBlack = new ContinuousHistogram(numArray4, new DoubleRange(0.0, 1.0)); this.cbHistogramWithoutBlack = new ContinuousHistogram(numArray5, new DoubleRange(-0.5, 0.5)); this.crHistogramWithoutBlack = new ContinuousHistogram(numArray6, new DoubleRange(-0.5, 0.5)); }
private unsafe void ProcessImage(UnmanagedImage image, byte *mask, int maskLineSize) { int width = image.Width; int height = image.Height; pixels = (pixelsWithoutBlack = 0); int[] array = new int[256]; int[] array2 = new int[256]; int[] array3 = new int[256]; int[] array4 = new int[256]; int[] array5 = new int[256]; int[] array6 = new int[256]; RGB rGB = new RGB(); YCbCr yCbCr = new YCbCr(); int num = (image.PixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; int num2 = image.Stride - width * num; int num3 = maskLineSize - width; byte *ptr = (byte *)image.ImageData.ToPointer(); if (mask == null) { for (int i = 0; i < height; i++) { int num4 = 0; while (num4 < width) { rGB.Red = ptr[2]; rGB.Green = ptr[1]; rGB.Blue = *ptr; YCbCr.FromRGB(rGB, yCbCr); array[(int)(yCbCr.Y * 255f)]++; array2[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++; array3[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++; pixels++; if ((double)yCbCr.Y != 0.0 || (double)yCbCr.Cb != 0.0 || (double)yCbCr.Cr != 0.0) { array4[(int)(yCbCr.Y * 255f)]++; array5[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++; array6[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++; pixelsWithoutBlack++; } num4++; ptr += num; } ptr += num2; } } else { for (int j = 0; j < height; j++) { int num5 = 0; while (num5 < width) { if (*mask != 0) { rGB.Red = ptr[2]; rGB.Green = ptr[1]; rGB.Blue = *ptr; YCbCr.FromRGB(rGB, yCbCr); array[(int)(yCbCr.Y * 255f)]++; array2[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++; array3[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++; pixels++; if ((double)yCbCr.Y != 0.0 || (double)yCbCr.Cb != 0.0 || (double)yCbCr.Cr != 0.0) { array4[(int)(yCbCr.Y * 255f)]++; array5[(int)(((double)yCbCr.Cb + 0.5) * 255.0)]++; array6[(int)(((double)yCbCr.Cr + 0.5) * 255.0)]++; pixelsWithoutBlack++; } } num5++; ptr += num; mask++; } ptr += num2; mask += num3; } } yHistogram = new ContinuousHistogram(array, new Range(0f, 1f)); cbHistogram = new ContinuousHistogram(array2, new Range(-0.5f, 0.5f)); crHistogram = new ContinuousHistogram(array3, new Range(-0.5f, 0.5f)); yHistogramWithoutBlack = new ContinuousHistogram(array4, new Range(0f, 1f)); cbHistogramWithoutBlack = new ContinuousHistogram(array5, new Range(-0.5f, 0.5f)); crHistogramWithoutBlack = new ContinuousHistogram(array6, new Range(-0.5f, 0.5f)); }