Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VC#] Image - Zoom, Как правильно увеличивать/уменьшать изоб 
V
    Опции темы
MuForum
Дата 1.9.2008, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Доброе время суток!
- Использую MVS2008.
- C#, .NET 2.0
- Мне необходимо осуществлять масштабирование изображения, то есть изменять его разрешение. Как правильно это реализовывать?
- Естественно, для того, чтобы качество было лучше, необходимо брать оригинальное изображение и уже его изменять.

# Вопрос №1: Как правильно вычислить разрешение нового изображения, если его нужно увеличить или уменьшить на 5%?
- Осуществлять данное действие необходимо многократно, так что попрошу не писать частные случаи....


- Мой код следующий, но я уверен, что тут присутствуют недочёты:
Код

TSaveImage.img - оригинальное изображение. (class Image)
TSaveImage.ZoomIndex - счетчик увеличения. (int)
...
        private void bor_Image_Zoom(bool enlarge)
        {
            if (TSaveImage.Status && TSaveImage.img != null)
            {
                try
                {
                    if (enlarge)
                    {
                        if (TSaveImage.ZoomIndex < 40) // Максимально можно приблизить до 300%.
                        {
                            TSaveImage.ZoomIndex++;
                            int WidthRe = TSaveImage.Width; // Оригинальная ширина изображения.
                            int HeightRe = TSaveImage.Height; // Оригинальная высота изображения.
                            if (TSaveImage.ZoomIndex > 0)
                            {
                                for (int i = 0; i < TSaveImage.ZoomIndex; i++)
                                {
                                    WidthRe += Convert.ToInt32(WidthRe / 100 * 5);
                                    HeightRe += Convert.ToInt32(HeightRe / 100 * 5);
                                }
                            }
                            else
                            {
                                for (int i = 0; i > TSaveImage.ZoomIndex; i--)
                                {
                                    WidthRe -= Convert.ToInt32(WidthRe / 100 * 5);
                                    HeightRe -= Convert.ToInt32(HeightRe / 100 * 5);
                                }
                            }
                            // ----
                            pb_main.Image = new Bitmap(TSaveImage.img, WidthRe, HeightRe);
                        }
                    }
                    else
                    {
                        if (TSaveImage.ZoomIndex > -19) // Максимально можно уменьшить до 5%.
                        {
                            TSaveImage.ZoomIndex--;
                            int WidthRe = TSaveImage.Width;
                            int HeightRe = TSaveImage.Height;
                            if (TSaveImage.ZoomIndex > 0)
                            {
                                for (int i = 0; i < TSaveImage.ZoomIndex; i++)
                                {
                                    WidthRe += Convert.ToInt32(WidthRe / 100 * 5);
                                    HeightRe += Convert.ToInt32(HeightRe / 100 * 5);
                                }
                            }
                            else
                            {
                                for (int i = 0; i > TSaveImage.ZoomIndex; i--)
                                {
                                    WidthRe -= Convert.ToInt32(WidthRe / 100 * 5);
                                    HeightRe -= Convert.ToInt32(HeightRe / 100 * 5);
                                }
                            }
                            // ----
                            pb_main.Image = new Bitmap(TSaveImage.img, WidthRe, HeightRe);
                        }
                    }
                }
                catch (Exception) { TSaveImage.ZoomIndex = 0; }
            }
        }



# Вопрос №2: Что лучше использовать для преобразования нового изображения, какой метод?
Код

1. Image.GetThumbnailImage(параметры)
2. new Bitmap(параметры)



P.S. -> Парни, я с графикой только начал работать. (Хотя это очень громко сказано)
- Что-то не так, я это чувствую и вижу, помогите пожалуйста составить нормальную расчетную формулу.
- Хотябы на словах если возможно. 

Это сообщение отредактировал(а) MuForum - 1.9.2008, 01:09


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Bishop
Дата 1.9.2008, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 3
Всего: 16



MuForum, 
Все что нужно:
Код
if (ZommIndex < 40 && ZommIndex > -20 && ZoomIndex != 0)
{
    int percent = (100 + ZoomIndex * 5) / 100;
    pb_main.Image = 
        new Bitmap(TSaveImage.img, TSaveImage.Width * percent, TSaveImage.Height * percent);
}

Чувствуешь разницу?

Это сообщение отредактировал(а) Bishop - 1.9.2008, 09:55
PM WWW ICQ   Вверх
MuForum
Дата 1.9.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



Цитата(Bishop @ 1.9.2008,  09:53)
MuForum, 
Все что нужно:
Код
if (ZommIndex < 40 && ZommIndex > -20 && ZoomIndex != 0)
{
    int percent = (100 + ZoomIndex * 5) / 100;
    pb_main.Image = 
        new Bitmap(TSaveImage.img, TSaveImage.Width * percent, TSaveImage.Height * percent);
}

Чувствуешь разницу?

Честно говоря, этот вариант сможет масштабировать только кратные масштабы!

- Данный вариант получше, но он всё равно что-то не так:
Код

        private void Image_Zoom(bool enlarge)
        {
            if (TSaveImage.Status && TSaveImage.img != null)
            {
                try
                {
                    if (enlarge)
                    {
                        if (TSaveImage.ZoomIndex < 40)
                        {
                            TSaveImage.ZoomIndex++;
                            int WidthRe = TSaveImage.Width + Convert.ToInt32(TSaveImage.Width / 100 * TSaveImage.ZoomIndex * 5);
                            int HeightRe = TSaveImage.Height + Convert.ToInt32(TSaveImage.Height / 100 * TSaveImage.ZoomIndex * 5);
                            pb_main.Image = new Bitmap(TSaveImage.img, WidthRe, HeightRe);
                            ImgWrite = true;
                        }
                    }
                    else
                    {
                        if (TSaveImage.ZoomIndex > -19)
                        {
                            TSaveImage.ZoomIndex--;
                            int WidthRe = TSaveImage.Width + Convert.ToInt32(TSaveImage.Width / 100 * TSaveImage.ZoomIndex * 5);
                            int HeightRe = TSaveImage.Height + Convert.ToInt32(TSaveImage.Height / 100 * TSaveImage.ZoomIndex * 5);
                            pb_main.Image = new Bitmap(TSaveImage.img, WidthRe, HeightRe);
                            ImgWrite = true;
                        }
                    }
                }
                catch (Exception) { TSaveImage.ZoomIndex = 0; }
            }
        }



P.S. -> Не совсем грамотно обрабатывает изображение. (Мне кажется надо что-то ещё учитывать, типа горизонтального/вертикально разрешения)
- Я в этом не особо смыслю, но то, что формула должна быть другой 100%.


# Добавлено: Например, берём картинку с разрешением '192x64', и при использование данных формул картинка будет изменяться только в ширину, высота будет оставаться тойже!

Это сообщение отредактировал(а) MuForum - 1.9.2008, 15:38


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
MuForum
Дата 1.9.2008, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: 2
Всего: 4



# for all - Благодарю всех за помощь, получилась следующая под-программа: (Код взят с codeproject.com и частично изменён)
Код

        public static Image ScaleByPercent(Image imgPhoto, int Percent)
        {
            Bitmap bmPhoto = null;
            try
            {
                float nPercent = (float)Percent / 100; // Вычисляем процент изменения изображения. 100% - 1, 50% - 0.5, 5% - 0.05.
                // ----
                int sourceWidth = imgPhoto.Width; // Оригинальная ширина изображения.
                int sourceHeight = imgPhoto.Height; // Оригинальная высота изображения.
                int sourceX = 0; // 'X' координата начала отрисовки изображения.
                int sourceY = 0; // 'Y' координата начала отрисовки изображения.
                // ----
                int destX = 0; // 'X' координата начала копирования с оригинального изображения.
                int destY = 0; // 'Y' координата начала копирования с оригинального изображения.
                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.SmoothingMode = SmoothingMode.HighQuality; // Способ Сглаживания - высокое.
                    grPhoto.PixelOffsetMode = PixelOffsetMode.HighQuality; // Способ Компенсации Пикселя - высокий.
                    grPhoto.CompositingQuality = CompositingQuality.HighQuality; // Композиционное качество - высокое.
                    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;
        }



P.S. -> Подробнее можно узнать/почитать на следующем ресурсе: GDI+ Лекция из курса «Введение в программирование на C# 2.0».

Это сообщение отредактировал(а) MuForum - 1.9.2008, 16:30


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.