Accord.Imaging.Filters.Concatenate.ProcessFilter C# (CSharp) Method

ProcessFilter() protected method

Process the filter on the specified image.
protected ProcessFilter ( UnmanagedImage sourceData, UnmanagedImage destinationData ) : void
sourceData UnmanagedImage Source image data.
destinationData UnmanagedImage Destination image data.
return void
        protected override void ProcessFilter(UnmanagedImage sourceData, UnmanagedImage destinationData)
        {
            // Lock the overlay image (left image)
            BitmapData overlayData = overlayImage.LockBits(
                new Rectangle(0, 0, overlayImage.Width, overlayImage.Height),
                ImageLockMode.ReadOnly, overlayImage.PixelFormat);

            int dstHeight = destinationData.Height;
            int src1Height = overlayData.Height;
            int src2Height = sourceData.Height;

            int src1Stride = overlayData.Stride;
            int src2Stride = sourceData.Stride;
            int dstStride = destinationData.Stride;

             int pixelSize = System.Drawing.Image.GetPixelFormatSize(sourceData.PixelFormat) / 8;
             int copySize1 = overlayData.Width * pixelSize;
             int copySize2 = sourceData.Width * pixelSize;

            // do the job
            unsafe
            {
                byte* src1 = (byte*)overlayData.Scan0.ToPointer();
                byte* src2 = (byte*)sourceData.ImageData.ToPointer();
                byte* dst = (byte*)destinationData.ImageData.ToPointer();

                // for each line
                for (int y = 0; y < dstHeight; y++)
                {
                    if (y < src1Height)
                        Accord.SystemTools.CopyUnmanagedMemory(dst, src1, copySize1);
                    if (y < src2Height)
                        Accord.SystemTools.CopyUnmanagedMemory(dst + copySize1, src2, copySize2);
                    
                    src1 += src1Stride;
                    src2 += src2Stride;
                    dst += dstStride;
                }
            }

            // Release
            overlayImage.UnlockBits(overlayData);
        }
    }