GDI + изменение размера для пиксельного зума - PullRequest
2 голосов
/ 29 марта 2009

Я хочу изменить размер изображения с помощью библиотеки GDI, чтобы при изменении его размера оно было больше, чем раньше, чтобы не было смешения. (Как при увеличении изображения в программе рисования)

EG: если мое изображение имеет ширину 2 пикселя и высоту 2 пикселя
(белый, белый,
белый, черный)
и я изменяю его размер, чтобы он был на 100% больше, это 4px на 4px высотой
(белый, белый, белый, белый,
белый, белый, белый, белый,
белый, белый, черный, черный,
белый, белый, черный, черный)

Какой режим InterpolationMode или Smoothing (или другие свойства) графического объекта можно использовать для достижения этой цели? Все комбинации, которые я пробовал до сих пор, вызывают появление серого на тестовом изображении.

Вот код, который я использую

    /// <summary>
    /// Do the resize using GDI+
    /// Credit to the original author
    /// http://www.bryanrobson.net/dnn/Code/Imageresizing/tabid/69/Default.aspx
    /// </summary>
    /// <param name="srcBitmap">The source bitmap to be resized</param>
    /// <param name="width">The target width</param>
    /// <param name="height">The target height</param>
    /// <param name="isHighQuality">Shoule the resize be done at high quality?</param>
    /// <returns>The resized Bitmap</returns>

    public static Bitmap Resize(Bitmap srcBitmap, int width, int height, bool isHighQuality)
    {
        // Create the destination Bitmap, and set its resolution
        Bitmap destBitmap = new Bitmap((int)Convert.ToInt32(width), (int)Convert.ToInt32(height), PixelFormat.Format24bppRgb);
        destBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);

        // Create a Graphics object from the destination Bitmap, and set the quality
        Graphics grPhoto = Graphics.FromImage(destBitmap);
        if (isHighQuality)
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        }
        else
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; //? this doesn't work
            grPhoto.InterpolationMode = InterpolationMode.NearestNeighbor; //? this doesn't work


        }
        // Do the resize
        grPhoto.DrawImage(srcBitmap,
              new Rectangle(0, 0, width, height),
              new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),
              GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return destBitmap;
    }

Ответы [ 3 ]

3 голосов
/ 20 мая 2009

Вы были на правильном пути, используя InterpolationMode.NearestNeighbor. Однако при использовании PixelOffsetMode по умолчанию GDI + будет пытаться производить выборку по краям пикселя, вызывая смешивание.

Чтобы получить масштабирование без наложения, вам также необходимо использовать PixelOffsetMode.Half. Измените свой случай не высокого качества на:

else
{
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
}
0 голосов
/ 30 марта 2009

Не похоже, что ты делаешь со мной что-то не так. См. Инструкции от Microsoft по InterpolationMode:

http://msdn.microsoft.com/en-us/library/ms533836(VS.85).aspx

Может быть, эта функция работает отлично, но вы задаете неверные параметры или неправильно отображаете результат?

0 голосов
/ 29 марта 2009

Когда вы рисуете изображение и передаете исходный прямоугольник, передайте только увеличенную часть исходного изображения и перетяните его в большую область. Когда пользователь увеличивает масштаб изображения, в какой-то момент он не сможет увидеть все изображение в области просмотра. Итак, определите, какая область источника должна быть видна, и нарисуйте только это.

...