示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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;
        }
示例#4
0
        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;
        }