Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2012, 17:43   #1
DENIS_POLOTSK
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 29
Восклицание Алгоритм масштабирования изображения(х1, х2, х3...)

Здравствуйте! Я новичок в компьютерной графике, а в курсовом проекте необходимо сделать программу, которая загружает изображение, затем увеличивает его в n целых раз, с помощью алгоритма масштабирования, полученное изображение сохраняется. Пересмотрел в нете кучу алгоритмов, таких как: hq2x, hq3x,2xsal, Eagle...но все они были описаны математически, столкнулся с трудом перевода их на язык C# пожалуйста помогите чем можете!!!
DENIS_POLOTSK вне форума Ответить с цитированием
Старый 28.05.2012, 18:03   #2
DENIS_POLOTSK
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 29
По умолчанию

Например, как организовать этот алгоритм в C#?
Eagle работает следующим образом: для каждого входного пиксела генерируется 4 выходных, первоначально цвета всех четырех устанавливаются в цвет текущего сканируемого пикселя (точно так же, как и в ближайшем соседе), дальше просматриваются пикселы сверху и слева, если они одинакового цвета (все три), то красим левый верхний пиксел в этот цвет, выполняем аналогичные действия для всех четырех пикселей и двигаемся дальше.[3] »

Сначала:
. . . --\ CC
. C . --/ CC
. . .
|Затем:
|S T U --\ 1 2
|V C W --/ 3 4
|X Y Z

| Если V==S==T => 1=S
| Если T==U==W => 2=U
| Если V==X==Y => 3=X
| Если W==Z==Y => 4=Z
DENIS_POLOTSK вне форума Ответить с цитированием
Старый 28.05.2012, 18:08   #3
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

и в чем проблема?
Reskov вне форума Ответить с цитированием
Старый 28.05.2012, 18:15   #4
DENIS_POLOTSK
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 29
По умолчанию

как реализовать алгоритм программно
DENIS_POLOTSK вне форума Ответить с цитированием
Старый 28.05.2012, 18:16   #5
DENIS_POLOTSK
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 29
По умолчанию

Есть такой код, что писать дальше?
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Load("D:\\X.bmp");
}

private void button2_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image.Height,pic tureBox1.Image.Width);
pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, pictureBox1.Image.Height, pictureBox1.Image.Width));
pictureBox1.Image = bmp;
for (int y = 0; y < bmp.Height; ++y)
{
for (int x = 0; x < bmp.Width; ++x)
{
Color c = bmp.GetPixel(x, y);
// тут логика программы
}
}
}
DENIS_POLOTSK вне форума Ответить с цитированием
Старый 28.05.2012, 19:01   #6
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

написал какую-то кривульку, которая вроде работает...
Код:
 private int[][] GetPixelMatrix(Bitmap t,int x,int y)
        {
            if (x < 0 || x >= t.Width)
                throw new ArgumentOutOfRangeException("x", "ValidRangeX");
            if (y < 0 || y >= t.Height)
                throw new ArgumentOutOfRangeException("y", "ValidRangeY");
            var matrix = new int[3][];
            for (int i = -1; i < 2; i++)
            {
                matrix[i + 1] = new int[3];
                for (int j = -1; j < 2; j++)
                {
                    Color c = t.GetPixel(x, y);
                    try
                    {
                        c=t.GetPixel(x + i, y + j);
                    }
                    catch {}
                    matrix[i+1][j+1] = c.ToArgb();
                }
            }
            return matrix;
        }


        private void button2_Click(object sender, EventArgs e)
        {
            pictureBox1.Load("D:\\1.bmp");
            Bitmap bmp = new Bitmap(pictureBox1.Image.Width, pictureBox1.Image.Height);
            pictureBox1.DrawToBitmap(bmp, new Rectangle(0, 0, pictureBox1.Image.Width, pictureBox1.Image.Height));
           // pictureBox1.Image = bmp;
            var temp = new Bitmap(pictureBox1.Image.Width*2, pictureBox1.Image.Height*2);
            for (int y = 0; y < bmp.Height; ++y)
            {
                for (int x = 0; x < bmp.Width; ++x)
                {

                    Color c = bmp.GetPixel(x, y);
                    int x2 = x * 2;
                    int y2 = y * 2;
                    temp.SetPixel(x2,y2,c);
                    temp.SetPixel(x2, y2+1, c);
                    temp.SetPixel(x2+1, y2+1, c);
                    temp.SetPixel(x2+1, y2, c);

                    var matrix = this.GetPixelMatrix(bmp, x, y);

                    if ((matrix[0][0] == matrix[0][1]) && (matrix[0][0]== matrix[1][0]))
                    {
                        temp.SetPixel(x2, y2, Color.FromArgb(matrix[0][0]));
                    }
                    if ((matrix[0][2] == matrix[0][1]) && (matrix[0][1] == matrix[0][2]))
                    {
                        temp.SetPixel(x2, y2+1, Color.FromArgb(matrix[0][2]));
                    }
                    if ((matrix[1][0] == matrix[2][0]) && (matrix[1][0] == matrix[2][1]))
                    {
                        temp.SetPixel(x2+1, y2, Color.FromArgb(matrix[2][0]));
                    }
                    if ((matrix[1][2] == matrix[2][1]) && (matrix[1][2] == matrix[2][2]))
                    {
                        temp.SetPixel(x2+1, y2+1, Color.FromArgb(matrix[2][2]));
                    }

                }
            }
            pictureBox2.Image = temp;
            temp.Save("D:\\2.bmp");
        }

Последний раз редактировалось Reskov; 28.05.2012 в 19:09. Причина: c=t.GetPixel(x + i, y + j);
Reskov вне форума Ответить с цитированием
Старый 28.05.2012, 21:35   #7
DENIS_POLOTSK
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 29
По умолчанию

Спасибо большое, очень помогли!!! Я так понимаю, этим алгоритмом можно увеличить только в 4 раза...а можно что нибудь исправить, и сделать так, что бы увеличивало в 2 раза?

Последний раз редактировалось DENIS_POLOTSK; 28.05.2012 в 21:51.
DENIS_POLOTSK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
коэффициент масштабирования zolman Помощь студентам 0 13.04.2011 11:44
Алгоритм масштабирования Alex Cones Свободное общение 4 25.05.2010 16:02
Алгоритм упаковывания изображения MIKI Общие вопросы C/C++ 4 04.06.2008 20:09
Алгоритм упаковывания изображения MIKI Фриланс 7 06.04.2008 20:03