/// <summary>
        /// Изменяет размеры исходного изображения без потерь качества.
        /// </summary>
        /// <param name="sourceImage">Исходное изображение.</param>
        /// <param name="width">Новая ширина.</param>
        /// <param name="height">Новая высота.</param>
        /// <param name="algorithm">Алгоритм изменения размера.</param>
        /// <returns></returns>
        public static Bitmap Resize(this Bitmap sourceImage, int width, int height, AntialiasingMethod algorithm)
        {
            BitmapData sourceData = sourceImage.LockBits(new Rectangle(0, 0, sourceImage.Width, sourceImage.Height), ImageLockMode.ReadOnly, sourceImage.PixelFormat);

            try
            {
                return(Resize(sourceData, width, height, algorithm));
            }
            finally
            {
                sourceImage.UnlockBits(sourceData);
            }
        }
 /// <summary>
 /// Изменяет размеры исходного изображения без потерь качества.
 /// </summary>
 /// <param name="sourceImage">Исходное изображение.</param>
 /// <param name="newSize">Новые размеры.</param>
 /// <param name="algorithm">Алгоритм изменения размера.</param>
 /// <returns></returns>
 public static Bitmap Resize(this Bitmap sourceImage, Size newSize, AntialiasingMethod algorithm)
 => Resize(sourceImage, newSize.Width, newSize.Height, algorithm);
        /// <summary>
        /// Изменяет размеры исходного изображения без потерь качества.
        /// </summary>
        /// <param name="sourceData">Исходное изображение.</param>
        /// <param name="width">Новая ширина.</param>
        /// <param name="height">Новая высота.</param>
        /// <param name="algorithm">Алгоритм изменения размера.</param>
        /// <returns></returns>
        public static Bitmap Resize(this BitmapData sourceData, int width, int height, AntialiasingMethod algorithm)
        {
            Bitmap destinationImage = sourceData.PixelFormat == PixelFormat.Format8bppIndexed
                    ? UnmanagedBitmap.CreateGrayscaleImage(width, height)
                    : new Bitmap(width, height, sourceData.PixelFormat);

            BitmapData destinationData = destinationImage.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, sourceData.PixelFormat);

            try
            {
                using (UnmanagedBitmap unmSource = new UnmanagedBitmap(sourceData))
                    using (UnmanagedBitmap unmDestination = new UnmanagedBitmap(destinationData))
                        AntialiasingFilter.Process(unmSource, unmDestination, width, height, algorithm);
            }
            finally
            {
                destinationImage.UnlockBits(destinationData);
            }

            destinationImage.SetResolution(300, 300);

            return(destinationImage);
        }
        /// <summary>
        /// Обрабатывает изображение указанным алгоритмом.
        /// </summary>
        /// <param name="sourceData">Исходное изображение.</param>
        /// <param name="destinationData">Изображение назначения.</param>
        /// <param name="newWidth">Новая ширина.</param>
        /// <param name="newHeight">новая высота.</param>
        /// <param name="algorithm">Алгоритм изменения размеров.</param>
        public static void Process(UnmanagedBitmap sourceData, UnmanagedBitmap destinationData, int newWidth, int newHeight, AntialiasingMethod algorithm)
        {
            switch (algorithm)
            {
            default:
            case AntialiasingMethod.NearestNeighbor:
                NearestNeighbor(sourceData, destinationData, newWidth, newHeight);
                break;

            case AntialiasingMethod.Bilinear:
                Bilinear(sourceData, destinationData, newWidth, newHeight);
                break;

            case AntialiasingMethod.Bicubic:
                Bicubic(sourceData, destinationData, newWidth, newHeight);
                break;
            }
        }