private static Bitmap PerChannelProcess(Bitmap destImg, int destX, int destY, int destWidth, int destHeight, Bitmap srcImg, int srcX, int srcY, PerChannelProcessDelegate channelProcessFunction) { var dst = destImg; // new Bitmap(destImg); var dstData = dst.LockBits(new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); var dstStride = Math.Abs(dstData.Stride); var dstScan0 = dstData.Scan0; var dstBuffer = new byte[dstStride]; var src = srcImg; //new Bitmap(srcImg); var srcData = src.LockBits(new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); var srcStride = Math.Abs(srcData.Stride); var srcScan0 = srcData.Scan0; var srcBuffer = new byte[srcStride]; for (var y = 0; y < destHeight; y++) { System.Runtime.InteropServices.Marshal.Copy(srcScan0 + y * srcStride, srcBuffer, 0, srcStride); System.Runtime.InteropServices.Marshal.Copy(dstScan0 + y * dstStride, dstBuffer, 0, dstStride); for (var x = 0; x < 3 * destWidth; x++) { dstBuffer[x] = channelProcessFunction(ref srcBuffer[x], ref dstBuffer[x]); } System.Runtime.InteropServices.Marshal.Copy(dstBuffer, 0, dstScan0 + y * dstStride, dstStride); } //unsafe //{ // byte* pDst = (byte*)(void*)dstScan0; // byte* pSrc = (byte*)(void*)srcScan0; // for (int y = 0; y < destHeight; y++) // { // for (int x = 0; x < destWidth * 3; x++) // { // pDst[x + y * dstStride] = channelProcessFunction(ref pSrc[x + y * srcStride], ref pDst[x + y * dstStride]); // } // } //} src.UnlockBits(srcData); dst.UnlockBits(dstData); return(dst); }
private Bitmap PerChannelProcess(ref Image destImg, int destX, int destY, int destWidth, int destHeight, ref Image srcImg, int srcX, int srcY, PerChannelProcessDelegate ChannelProcessFunction) { Bitmap dst = new Bitmap(destImg); Bitmap src = new Bitmap(srcImg); BitmapData dstBD = dst.LockBits(new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); BitmapData srcBD = src.LockBits(new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int dstStride = dstBD.Stride; int srcStride = srcBD.Stride; System.IntPtr dstScan0 = dstBD.Scan0; System.IntPtr srcScan0 = srcBD.Scan0; unsafe { byte *pDst = (byte *)(void *)dstScan0; byte *pSrc = (byte *)(void *)srcScan0; for (int y = 0; y < destHeight; y++) { for (int x = 0; x < destWidth * 3; x++) { pDst[x + y * dstStride] = ChannelProcessFunction(ref pSrc[x + y * srcStride], ref pDst[x + y * dstStride]); } } } src.UnlockBits(srcBD); dst.UnlockBits(dstBD); src.Dispose(); return(dst); }
private static Bitmap PerChannelProcess(Bitmap destImg, int destX, int destY, int destWidth, int destHeight, Bitmap srcImg, int srcX, int srcY, PerChannelProcessDelegate channelProcessFunction) { var dst = destImg; // new Bitmap(destImg); var dstData = dst.LockBits(new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); var dstStride = Math.Abs(dstData.Stride); var dstScan0 = dstData.Scan0; var dstBuffer = new byte[dstStride]; var src = srcImg; //new Bitmap(srcImg); var srcData = src.LockBits(new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); var srcStride = Math.Abs(srcData.Stride); var srcScan0 = srcData.Scan0; var srcBuffer = new byte[srcStride]; for (var y = 0; y < destHeight; y++) { System.Runtime.InteropServices.Marshal.Copy(srcScan0 + y * srcStride, srcBuffer, 0, srcStride); System.Runtime.InteropServices.Marshal.Copy(dstScan0 + y * dstStride, dstBuffer, 0, dstStride); for (var x = 0; x < 3* destWidth; x++) { dstBuffer[x] = channelProcessFunction(ref srcBuffer[x], ref dstBuffer[x]); } System.Runtime.InteropServices.Marshal.Copy(dstBuffer, 0, dstScan0 + y * dstStride, dstStride); } //unsafe //{ // byte* pDst = (byte*)(void*)dstScan0; // byte* pSrc = (byte*)(void*)srcScan0; // for (int y = 0; y < destHeight; y++) // { // for (int x = 0; x < destWidth * 3; x++) // { // pDst[x + y * dstStride] = channelProcessFunction(ref pSrc[x + y * srcStride], ref pDst[x + y * dstStride]); // } // } //} src.UnlockBits(srcData); dst.UnlockBits(dstData); return dst; }
private Bitmap PerChannelProcess(ref Image destImg, int destX, int destY, int destWidth, int destHeight, ref Image srcImg, int srcX, int srcY, PerChannelProcessDelegate ChannelProcessFunction) { Bitmap dst = new Bitmap(destImg); Bitmap src = new Bitmap(srcImg); BitmapData dstBD = dst.LockBits( new Rectangle(destX, destY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); BitmapData srcBD = src.LockBits( new Rectangle(srcX, srcY, destWidth, destHeight), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); int dstStride = dstBD.Stride; int srcStride = srcBD.Stride; System.IntPtr dstScan0 = dstBD.Scan0; System.IntPtr srcScan0 = srcBD.Scan0; unsafe { byte *pDst = (byte *)(void *)dstScan0; byte *pSrc = (byte *)(void *)srcScan0; for(int y = 0; y < destHeight; y++) { for(int x = 0; x < destWidth * 3; x++) { pDst[x + y * dstStride] = ChannelProcessFunction(ref pSrc[x + y * srcStride], ref pDst[x + y * dstStride]); } } } src.UnlockBits(srcBD); dst.UnlockBits(dstBD); src.Dispose(); return dst; }