2009-03-29 2 views
2

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

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

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

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

/// <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

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

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

else 
{ 
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; 
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; 
} 
+0

Крис, спасибо, я попробую это позже. Поскольку я задал вопрос некоторое время назад, и это был просто личный проект, я отпустил его, поскольку он был «достаточно хорош». Ваш ответ выглядит правильно (еще не пробовал, как я уже сказал), и я надеюсь, что это поможет некоторым людям, которые находят этот вопрос. – NetHawk

0

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

+0

Проблема не в том, что часть изображения проходит, а в том, что некоторое сглаживание всегда происходит независимо от того, что я выбираю в режиме интерполяции. Я постараюсь описать это лучше в сообщении. – NetHawk

0

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

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

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

Смежные вопросы