/// <summary>
 /// 
 /// </summary>
 /// <param name="nValue"></param>
 /// <param name="nChannel"></param>
 public ColourFilterStruct(byte nValue, FilterColour nChannel)
 {
     m_nValue = nValue;
     m_nChannel = nChannel;
 }
        public void ApplyColourFilter(FilterColour nFilterColour, byte nMod)
        {
            if (m_oBitmap == null)
                return;

            BitmapData oBmpData = m_oBitmap.LockBits(new Rectangle(Point.Empty, m_oBitmap.Size),
                ImageLockMode.ReadWrite, m_oBitmap.PixelFormat);

            IntPtr pScanLine = oBmpData.Scan0;
            int nBytes = oBmpData.Stride * oBmpData.Height;
            byte[] nByteArray = new byte[nBytes];

            // Marshal the unmanaged byte array to a managed byte array.
            Marshal.Copy(pScanLine, nByteArray, 0, nBytes);

            int nRed = 0;
            int nGreen = 0;
            int nBlue = 0;

            // Run through the byte array.
            for (int n = 0; n < nByteArray.Length; n += 4)
            {
                switch (nFilterColour)
                {
                    case FilterColour.Red:
                        nRed = nByteArray[n + 2] + nMod;
                        if (nRed < 0) nRed = 0;
                        else if (nRed > 255) nRed = 255;
                        nByteArray[n] = 0;
                        nByteArray[n + 1] = 0;
                        nByteArray[n + 2] = (byte)nRed;
                        break;
                    case FilterColour.Green:
                        nGreen = nByteArray[n + 1] + nMod;
                        if (nGreen < 0) nGreen = 0;
                        else if (nGreen > 255) nGreen = 255;
                        nByteArray[n] = 0;
                        nByteArray[n + 1] = (byte)nGreen;
                        nByteArray[n + 2] = 0;
                        break;
                    case FilterColour.Blue:
                        nBlue = nByteArray[n] + nMod;
                        if (nBlue < 0) nBlue = 0;
                        else if (nBlue > 255) nBlue = 255;
                        nByteArray[n] = (byte)nBlue;
                        nByteArray[n + 1] = 0;
                        nByteArray[n + 2] = 0;
                        break;
                }
            }

            // Marshal the managed byte array back to an unmanaged byte array.
            Marshal.Copy(nByteArray, 0, pScanLine, nBytes);

            // Unlock the bitmap.
            m_oBitmap.UnlockBits(oBmpData);
        }