Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > [VC#] Image - Zoom - pixels


Автор: MuForum 26.9.2008, 15:50
Доброе время суток.
- Столкнулся со следующей проблемой.

# Задача: Необходимо масштабировать изображение таким образом, чтобы картинка не размазывалась, а отображалась по пиксельно(как в 'ACD Photo Editor 3' и подобных программах.)

- Проблема в том, что когда приближаешь, картинка становится не чёткой, а мне необходимо работать визуально с пикселями. (Делаю графический редактор игровых карт)

# Код масшатибрования:
Код

        public static Bitmap ScaleByPercent(Bitmap imgPhoto, int Percent)
        {
            Bitmap bmPhoto = null;
            // ----
            try
            {
                float nPercent = (float)Percent / 100;
                // ----
                int sourceWidth = imgPhoto.Width;
                int sourceHeight = imgPhoto.Height;
                int sourceX = 0;
                int sourceY = 0;
                // ----
                int destX = 0;
                int destY = 0;
                int destWidth = (int)(sourceWidth * nPercent);
                int destHeight = (int)(sourceHeight * nPercent);
                // ----
                bmPhoto = new Bitmap(destWidth, destHeight);
                bmPhoto.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);
                // ----
                // Scale the bitmap in high quality mode.
                using (Graphics grPhoto = Graphics.FromImage(bmPhoto))
                {
                    grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    grPhoto.DrawImage(imgPhoto,
                        new Rectangle(destX, destY, destWidth, destHeight),
                        new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
                        GraphicsUnit.Pixel);
                }
            }
            catch (Exception) { bmPhoto = null; }
            // ----
            return bmPhoto;
        }



# ACD Photo Editor: http://ipicture.ru/Gallery/Viewfull/7242922.html
# Используемый вариант: http://ipicture.ru/Gallery/Viewfull/7242979.html

Автор: Zakonnic 26.9.2008, 16:34
По идее такого эффекта не должно быть при увеличении. Дело похоже в фильтрации, а значит сойдет и обычный Bicubic, а не HighQualityBicubic. Последний вроде лучше применять при уменьшении размеров. В крайнем случае - InterpolationMode.NearestNeighbor, он точно смазывать не будет. 

А если надо пиксели отображать точно, то просто масштабирование нужно делать в целое число раз - в 2,3,4 и т.д. По другому картинка не может масштабироваться без артифактов.

Автор: MuForum 26.9.2008, 16:38
Цитата(Zakonnic @ 26.9.2008,  16:34)
Если нужна четкая граница вместо сглаживания можно попробовать InterpolationMode.NearestNeighbor вместо HighQualityBicubic.
А вообще картинка не может масштабироваться без артифактов.

Благодарю за подсказку, вопрос решён  smile 

P.S. -> Если можно, то хотелось бы больше узнать о 'А вообще картинка не может масштабироваться без артифактов.'.

Автор: Zakonnic 26.9.2008, 16:55
А чего тут узнавать? Экран у тебя из пикселей. Допустим взял и увеличил изображение в 1.5 раза. Куда полпикселя девать? Вот и смешиваются цвета.

ЗЫ. Медленно доходит. http://ru.wikipedia.org/wiki/Артефакт:
Цитата

В компьютерной графике — нежелательные особенности изображения, сгенерированного компьютером, появляющиеся в определённых условиях (переходы яркости или цветности, движение изображения, режимы вывода, предназначенные для ускорения работы, недостаточно качественная компрессия текстур и так далее). Внешне могут выглядеть как муар, искажения цветов, негладкие линии, несовместное движение частей изображения, «щели» между полигонами и прочее.
 smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)