public static bool AdditiveColor(Bitmap bmpDst, Bitmap bmpSrc, RGBSelection rgb, int dstX, int dstY) { if (bmpDst.PixelFormat != PixelFormat.Format24bppRgb) return false; if (bmpSrc.PixelFormat != PixelFormat.Format24bppRgb) return false; Rectangle dstRect = new Rectangle(0, 0, bmpDst.Width, bmpDst.Height); Rectangle srcRect = new Rectangle(dstX, dstY, bmpSrc.Width, bmpSrc.Height); if (!dstRect.IntersectsWith(srcRect)) return true; dstRect.Intersect(srcRect); int scanX = dstRect.X; int scanY = dstRect.Y; int scanEndX = scanX + dstRect.Width; int scanEndY = scanY + dstRect.Height; BmpProc24 src = new BmpProc24(bmpSrc); BmpProc24 dst = new BmpProc24(bmpDst); switch (rgb) { case RGBSelection.all: for (int y = scanY; y < scanEndY; y++) for (int x = scanX; x < scanEndX; x++) { src.SetXY(x - dstX, y - dstY); dst.SetXY(x, y); dst.R = AdjustByte(dst.R + src.R); dst.G = AdjustByte(dst.G + src.G); dst.B = AdjustByte(dst.B + src.B); } break; case RGBSelection.red: for (int y = scanY; y < scanEndY; y++) for (int x = scanX; x < scanEndX; x++) { src.SetXY(x - dstX, y - dstY); dst.SetXY(x, y); dst.R = AdjustByte(dst.R + src.R); } break; case RGBSelection.green: for (int y = scanY; y < scanEndY; y++) for (int x = scanX; x < scanEndX; x++) { src.SetXY(x - dstX, y - dstY); dst.SetXY(x, y); dst.G = AdjustByte(dst.G + src.G); } break; case RGBSelection.blue: for (int y = scanY; y < scanEndY; y++) for (int x = scanX; x < scanEndX; x++) { src.SetXY(x - dstX, y - dstY); dst.SetXY(x, y); dst.B = AdjustByte(dst.B + src.B); } break; } CallDispose(dst, src); return true; }
public static bool AdditiveColor(Bitmap bmpDst, Bitmap bmpSrc, RGBSelection rgb) { if (bmpDst.PixelFormat != PixelFormat.Format24bppRgb) return false; if (bmpSrc.PixelFormat != PixelFormat.Format24bppRgb) return false; int w = bmpDst.Width; int h = bmpDst.Height; if ((bmpSrc.Width != w) | (bmpSrc.Height != h)) return false; BmpProc24 src = new BmpProc24(bmpSrc); BmpProc24 dst = new BmpProc24(bmpDst); switch (rgb) { case RGBSelection.all: for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { src.SetXY(x, y); dst.SetXY(x, y); dst.R = AdjustByte(dst.R + src.R); dst.G = AdjustByte(dst.G + src.G); dst.B = AdjustByte(dst.B + src.B); } break; case RGBSelection.red: for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { src.SetXY(x, y); dst.SetXY(x, y); dst.R = AdjustByte(dst.R + src.R); } break; case RGBSelection.green: for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { src.SetXY(x, y); dst.SetXY(x, y); dst.G = AdjustByte(dst.G + src.G); } break; case RGBSelection.blue: for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { src.SetXY(x, y); dst.SetXY(x, y); dst.B = AdjustByte(dst.B + src.B); } break; } CallDispose(dst, src); return true; }