/// <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); }