AForge.Imaging.Filters.Convolution.ProcessFilter C# (CSharp) Метод

ProcessFilter() защищенный Метод

Process the filter on the specified image.
protected ProcessFilter ( UnmanagedImage source, UnmanagedImage destination, Rectangle rect ) : void
source UnmanagedImage Source image data.
destination UnmanagedImage Destination image data.
rect System.Drawing.Rectangle Image rectangle for processing by the filter.
Результат void
        protected override unsafe void ProcessFilter( UnmanagedImage source, UnmanagedImage destination, Rectangle rect )
        {
            int pixelSize = Image.GetPixelFormatSize( source.PixelFormat ) / 8;

            // processing start and stop X,Y positions
            int startX  = rect.Left;
            int startY  = rect.Top;
            int stopX   = startX + rect.Width;
            int stopY   = startY + rect.Height;

            // check pixel size to find if we deal with 8 or 16 bpp channels
            if ( ( pixelSize <= 4 ) && ( pixelSize != 2 ) )
            {
                int srcStride = source.Stride;
                int dstStride = destination.Stride;

                int srcOffset = srcStride - rect.Width * pixelSize;
                int dstOffset = dstStride - rect.Width * pixelSize;

                byte* src = (byte*) source.ImageData.ToPointer( );
                byte* dst = (byte*) destination.ImageData.ToPointer( );

                // allign pointers to the first pixel to process
                src += ( startY * srcStride + startX * pixelSize );
                dst += ( startY * dstStride + startX * pixelSize );

                // do the processing job
                if ( destination.PixelFormat == PixelFormat.Format8bppIndexed )
                {
                    // grayscale image
                    Process8bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY );
                }
                else
                {
                    // RGB image
                    if ( ( pixelSize == 3 ) || ( !processAlpha ) )
                    {
                        Process24bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY, pixelSize );
                    }
                    else
                    {
                        Process32bppImage( src, dst, srcStride, dstStride, srcOffset, dstOffset, startX, startY, stopX, stopY );
                    }
                }
            }
            else
            {
                pixelSize /= 2;

                int dstStride = destination.Stride / 2;
                int srcStride = source.Stride / 2;

                // base pointers
                ushort* baseSrc = (ushort*) source.ImageData.ToPointer( );
                ushort* baseDst = (ushort*) destination.ImageData.ToPointer( );

                // allign pointers by X
                baseSrc += ( startX * pixelSize );
                baseDst += ( startX * pixelSize );

                if ( source.PixelFormat == PixelFormat.Format16bppGrayScale )
                {
                    // 16 bpp grayscale image
                    Process16bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY );
                }
                else
                {
                    // RGB image
                    if ( ( pixelSize == 3 ) || ( !processAlpha ) )
                    {
                        Process48bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY, pixelSize );
                    }
                    else
                    {
                        Process64bppImage( baseSrc, baseDst, srcStride, dstStride, startX, startY, stopX, stopY );
                    }
                }
            }
        }