public static Bitmap createHSVPattern(Stream backgroundStream, MadScience.Colours.HSVColor backgroundColor) { Bitmap output = new Bitmap(256, 256, PixelFormat.Format32bppArgb); Bitmap background = LoadBitmapFromStream(backgroundStream, 256, 256); if (background == null) { return(output); } BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData backgroundData = background.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Color outputColor; const int pixelSize = 4; //process every pixel unsafe { for (int y = 0; y < 256; y++) { byte *outputRow = (byte *)outputData.Scan0 + (y * outputData.Stride); byte *inputRow = (byte *)backgroundData.Scan0 + (y * backgroundData.Stride); for (int x = 0; x < 256; x++) { int pixelLocation = x * pixelSize; Color inputcolor = Color.FromArgb(255, inputRow[pixelLocation + 2], inputRow[pixelLocation + 1], inputRow[pixelLocation]); MadScience.Colours.HSVColor bgcolor = new MadScience.Colours.HSVColor(inputcolor); bgcolor.Hue += backgroundColor.Hue; bgcolor.Saturation += backgroundColor.Saturation; bgcolor.Value += backgroundColor.Value; outputColor = bgcolor.Color; outputRow[pixelLocation] = (byte)outputColor.B; outputRow[pixelLocation + 1] = (byte)outputColor.G; outputRow[pixelLocation + 2] = (byte)outputColor.R; outputRow[pixelLocation + 3] = (byte)outputColor.A; } } } output.UnlockBits(outputData); background.UnlockBits(backgroundData); return(output); }
public static Bitmap createHSVPattern(Stream backgroundStream, Stream maskStream, MadScience.Colours.HSVColor backgroundColor, Stream channel1Stream, Stream channel2Stream, Stream channel3Stream, MadScience.Colours.HSVColor channel1Color, MadScience.Colours.HSVColor channel2Color, MadScience.Colours.HSVColor channel3Color, bool[] channelEnabled) { Bitmap output = new Bitmap(256, 256, PixelFormat.Format32bppArgb); Bitmap background = LoadBitmapFromStream(backgroundStream, 256, 256); Bitmap mask = LoadBitmapFromStream(maskStream, 256, 256); if (background == null || mask == null) return output; Bitmap channel1 = LoadBitmapFromStreamOrEmpty(channel1Stream, 256, 256); Bitmap channel2 = LoadBitmapFromStreamOrEmpty(channel2Stream, 256, 256); Bitmap channel3 = LoadBitmapFromStreamOrEmpty(channel3Stream, 256, 256); BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData backgroundData = background.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData maskData = mask.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel1Data = channel1.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel2Data = channel2.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel3Data = channel3.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Color outputColor; const int pixelSize = 4; //process every pixel unsafe { for (int y = 0; y < 256; y++) { byte* outputRow = (byte*)outputData.Scan0 + (y * outputData.Stride); byte* inputRow = (byte*)backgroundData.Scan0 + (y * backgroundData.Stride); byte* maskRow = (byte*)maskData.Scan0 + (y * maskData.Stride); byte* channel1Row = (byte*)channel1Data.Scan0 + (y * channel1Data.Stride); byte* channel2Row = (byte*)channel2Data.Scan0 + (y * channel2Data.Stride); byte* channel3Row = (byte*)channel3Data.Scan0 + (y * channel3Data.Stride); for (int x = 0; x < 256; x++) { int pixelLocation = x * pixelSize; Color inputcolor = Color.FromArgb(255, inputRow[pixelLocation + 2], inputRow[pixelLocation + 1], inputRow[pixelLocation]); Color maskcolor = Color.FromArgb(maskRow[pixelLocation + 3], maskRow[pixelLocation + 2], maskRow[pixelLocation + 1], maskRow[pixelLocation]); MadScience.Colours.HSVColor bgcolor = new MadScience.Colours.HSVColor(inputcolor); bgcolor.Hue += backgroundColor.Hue; bgcolor.Saturation += backgroundColor.Saturation; bgcolor.Value += backgroundColor.Value; outputColor = bgcolor.Color; if (maskcolor.G > 0 && channelEnabled[0]) { Color channelcolor = Color.FromArgb(1, channel1Row[pixelLocation + 2], channel1Row[pixelLocation + 1], channel1Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel1Color.Hue; bgcolor.Saturation += channel1Color.Saturation; bgcolor.Value += channel1Color.Value; outputColor = ColorOverlay(maskcolor.G, outputColor, bgcolor.Color); } if (maskcolor.B > 0 && channelEnabled[1]) { Color channelcolor = Color.FromArgb(1, channel2Row[pixelLocation + 2], channel2Row[pixelLocation + 1], channel2Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel2Color.Hue; bgcolor.Saturation += channel2Color.Saturation; bgcolor.Value += channel2Color.Value; outputColor = ColorOverlay(maskcolor.B, outputColor, bgcolor.Color); } if (maskcolor.A > 0 && channelEnabled[2]) { Color channelcolor = Color.FromArgb(1, channel3Row[pixelLocation + 2], channel3Row[pixelLocation + 1], channel3Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel3Color.Hue; bgcolor.Saturation += channel3Color.Saturation; bgcolor.Value += channel3Color.Value; outputColor = ColorOverlay(maskcolor.A, outputColor, bgcolor.Color); } outputRow[pixelLocation] = (byte)outputColor.B; outputRow[pixelLocation + 1] = (byte)outputColor.G; outputRow[pixelLocation + 2] = (byte)outputColor.R; outputRow[pixelLocation + 3] = (byte)outputColor.A; } } } output.UnlockBits(outputData); mask.UnlockBits(maskData); background.UnlockBits(backgroundData); channel1.UnlockBits(channel1Data); channel2.UnlockBits(channel2Data); channel3.UnlockBits(channel3Data); return output; }
public static Bitmap createHSVPattern(Stream backgroundStream, MadScience.Colours.HSVColor backgroundColor) { Bitmap output = new Bitmap(256, 256, PixelFormat.Format32bppArgb); Bitmap background = LoadBitmapFromStream(backgroundStream, 256, 256); if (background == null) return output; BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData backgroundData = background.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Color outputColor; const int pixelSize = 4; //process every pixel unsafe { for (int y = 0; y < 256; y++) { byte* outputRow = (byte*)outputData.Scan0 + (y * outputData.Stride); byte* inputRow = (byte*)backgroundData.Scan0 + (y * backgroundData.Stride); for (int x = 0; x < 256; x++) { int pixelLocation = x * pixelSize; Color inputcolor = Color.FromArgb(255, inputRow[pixelLocation + 2], inputRow[pixelLocation + 1], inputRow[pixelLocation]); MadScience.Colours.HSVColor bgcolor = new MadScience.Colours.HSVColor(inputcolor); bgcolor.Hue += backgroundColor.Hue; bgcolor.Saturation += backgroundColor.Saturation; bgcolor.Value += backgroundColor.Value; outputColor = bgcolor.Color; outputRow[pixelLocation] = (byte)outputColor.B; outputRow[pixelLocation + 1] = (byte)outputColor.G; outputRow[pixelLocation + 2] = (byte)outputColor.R; outputRow[pixelLocation + 3] = (byte)outputColor.A; } } } output.UnlockBits(outputData); background.UnlockBits(backgroundData); return output; }
public static Bitmap createHSVPattern(Stream backgroundStream, Stream maskStream, MadScience.Colours.HSVColor backgroundColor, Stream channel1Stream, Stream channel2Stream, Stream channel3Stream, MadScience.Colours.HSVColor channel1Color, MadScience.Colours.HSVColor channel2Color, MadScience.Colours.HSVColor channel3Color, bool[] channelEnabled) { Bitmap output = new Bitmap(256, 256, PixelFormat.Format32bppArgb); Bitmap background = LoadBitmapFromStream(backgroundStream, 256, 256); Bitmap mask = LoadBitmapFromStream(maskStream, 256, 256); if (background == null || mask == null) { return(output); } Bitmap channel1 = LoadBitmapFromStreamOrEmpty(channel1Stream, 256, 256); Bitmap channel2 = LoadBitmapFromStreamOrEmpty(channel2Stream, 256, 256); Bitmap channel3 = LoadBitmapFromStreamOrEmpty(channel3Stream, 256, 256); BitmapData outputData = output.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData backgroundData = background.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData maskData = mask.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel1Data = channel1.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel2Data = channel2.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); BitmapData channel3Data = channel3.LockBits(new Rectangle(0, 0, 256, 256), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); Color outputColor; const int pixelSize = 4; //process every pixel unsafe { for (int y = 0; y < 256; y++) { byte *outputRow = (byte *)outputData.Scan0 + (y * outputData.Stride); byte *inputRow = (byte *)backgroundData.Scan0 + (y * backgroundData.Stride); byte *maskRow = (byte *)maskData.Scan0 + (y * maskData.Stride); byte *channel1Row = (byte *)channel1Data.Scan0 + (y * channel1Data.Stride); byte *channel2Row = (byte *)channel2Data.Scan0 + (y * channel2Data.Stride); byte *channel3Row = (byte *)channel3Data.Scan0 + (y * channel3Data.Stride); for (int x = 0; x < 256; x++) { int pixelLocation = x * pixelSize; Color inputcolor = Color.FromArgb(255, inputRow[pixelLocation + 2], inputRow[pixelLocation + 1], inputRow[pixelLocation]); Color maskcolor = Color.FromArgb(maskRow[pixelLocation + 3], maskRow[pixelLocation + 2], maskRow[pixelLocation + 1], maskRow[pixelLocation]); MadScience.Colours.HSVColor bgcolor = new MadScience.Colours.HSVColor(inputcolor); bgcolor.Hue += backgroundColor.Hue; bgcolor.Saturation += backgroundColor.Saturation; bgcolor.Value += backgroundColor.Value; outputColor = bgcolor.Color; if (maskcolor.G > 0 && channelEnabled[0]) { Color channelcolor = Color.FromArgb(1, channel1Row[pixelLocation + 2], channel1Row[pixelLocation + 1], channel1Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel1Color.Hue; bgcolor.Saturation += channel1Color.Saturation; bgcolor.Value += channel1Color.Value; outputColor = ColorOverlay(maskcolor.G, outputColor, bgcolor.Color); } if (maskcolor.B > 0 && channelEnabled[1]) { Color channelcolor = Color.FromArgb(1, channel2Row[pixelLocation + 2], channel2Row[pixelLocation + 1], channel2Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel2Color.Hue; bgcolor.Saturation += channel2Color.Saturation; bgcolor.Value += channel2Color.Value; outputColor = ColorOverlay(maskcolor.B, outputColor, bgcolor.Color); } if (maskcolor.A > 0 && channelEnabled[2]) { Color channelcolor = Color.FromArgb(1, channel3Row[pixelLocation + 2], channel3Row[pixelLocation + 1], channel3Row[pixelLocation]); bgcolor = new MadScience.Colours.HSVColor(channelcolor); bgcolor.Hue += channel3Color.Hue; bgcolor.Saturation += channel3Color.Saturation; bgcolor.Value += channel3Color.Value; outputColor = ColorOverlay(maskcolor.A, outputColor, bgcolor.Color); } outputRow[pixelLocation] = (byte)outputColor.B; outputRow[pixelLocation + 1] = (byte)outputColor.G; outputRow[pixelLocation + 2] = (byte)outputColor.R; outputRow[pixelLocation + 3] = (byte)outputColor.A; } } } output.UnlockBits(outputData); mask.UnlockBits(maskData); background.UnlockBits(backgroundData); channel1.UnlockBits(channel1Data); channel2.UnlockBits(channel2Data); channel3.UnlockBits(channel3Data); return(output); }