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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с классом Bitmap, Програмная обработка рисунков 
:(
    Опции темы
Rusel
Дата 9.9.2007, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.4.2007

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



Мне нужно запрограмировать алгоритмы обработки цифровых зобржений на примере Bitmap. Смысл в том чтобы открыть Bitmap, обработать его и вывести на экран. И у меня возникла проблема: я не могу програмно изменить яркость отдельно взятого пиксела. Подскажите если кто с этим сталкивался, как это сделать.
PM MAIL   Вверх
tdebugger
Дата 10.9.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 20.1.2007

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



Вот таким нехитрым методом можно уменьшить яркость некотой области в два раза:

Код

graphics.FillRectangle( new SolidBrush(Color.FromArgb(127,0,0,0)),0,0,10,10);

... ну а дальше подбором коеффициентов...

Это сообщение отредактировал(а) tdebugger - 10.9.2007, 08:23
--------------------
ТЕХНОЛОГИЯ "JAVA"  НЕ ПРЕДНАЗНАЧЕНА ДЛЯ УПРАВЛЕНИЯ ЯДЕРНЫМИ УСТАНОВКАМИWindows98 License.txt
PM MAIL MSN   Вверх
iad
Дата 10.9.2007, 14:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Rusel @  9.9.2007,  21:45 Найти цитируемый пост)
 я не могу програмно изменить яркость отдельно взятого пиксела.
 Можно юзать методы GetPixel и SetPixel объекта Bitmap .


PM MAIL   Вверх
Rusel
Дата 10.9.2007, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 26.4.2007

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



Цитата

Можно юзать методы GetPixel и SetPixel объекта Bitmap .

Есть небольшая проблема с SetPixel.... Bitmap с indexed pixel format не поддерживает SetPixel. А мне нужно обработать именно такие картинки
PM MAIL   Вверх
mr.DUDA
Дата 11.9.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вариант - скопировать битмап в другой битмап (через Graphics.DrawImage и графиксом созданным из Graphics.FromImage), выполнить на "нормальном" битмапе GetPixel/SetPixel, скопировать обратно таким же способом.


--------------------
user posted image
PM MAIL WWW   Вверх
Sergey_P
Дата 18.9.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007

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



у кого-нить есть пример, где описана обработка каждого пикселя на экране по сложным формулам

то есть получил пиксель по координатам X, Y ..получил отдельно значения красного, зеленого, синего; потом обработал каждый пиксель и сохранил обратно  smile  smile 
PM MAIL   Вверх
iad
Дата 18.9.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот реализация стандартного алгоритма изменения яркости. Для других преобразований - аналогично, только идет другое заполнение TransTable. TransTable это массив значений в которой индексом является исходное значение цветовой составляющей, а значением по этому индексу - новое значение.При использовании TransTable достаточно расчитать только 3*256 значений, а не считать значение для каждого пикселя, что при сложных алгоритмах дает значительный прирост производительности
Код

    public partial class Form1 : Form
    {
        Bitmap _bmpSrc;
        byte[][] TransTable;
        public Form1()
        {
            _bmpSrc = (Bitmap)Bitmap.FromFile("d:\\1.jpg");
            TransTable = new byte[3][];
            for (int i = 0; i < 3; i++)
            {
                TransTable[i] = new byte[256];
            }
            InitializeComponent();
        }
 
        void SetBrightness( int offset)
        {
            int t, i, buf;
            for (t = 0; t < 3; t++)
            {
                for (i = 0; i < 256; i++)
                {
                    buf=i+offset;
                    if (buf > 255) TransTable[t][i] = 255;
                    else if (buf < 0) TransTable[t][i] = 0;
                    else TransTable[t][i] = (byte)buf;
                }
            }
            
            int y;
            Color colorbuf;
            for (int x = 0; x < _bmpSrc.Width; x++)
            {
                for (y = 0; y < _bmpSrc.Height; y++)
                {
                    colorbuf = _bmpSrc.GetPixel(x, y);

                    colorbuf =Color.FromArgb(
                        colorbuf.A,
                        TransTable[0][colorbuf.R],
                        TransTable[1][colorbuf.G],
                        TransTable[2][colorbuf.B]
                        );

                    _bmpSrc.SetPixel(x, y, colorbuf);
                }
            }

            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(_bmpSrc,0, 0);
        }
    }


Это сообщение отредактировал(а) iad - 18.9.2007, 13:17
PM MAIL   Вверх
Sergey_P
Дата 18.9.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007

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



сорри за непонятливость, а чего менять, чтобы яркость изменилась?

 и если можно пример с рисованием на picturebox  smile 

Это сообщение отредактировал(а) Sergey_P - 18.9.2007, 16:16
PM MAIL   Вверх
iad
Дата 18.9.2007, 18:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Sergey_P @  18.9.2007,  16:50 Найти цитируемый пост)
сорри за непонятливость
Sergey_P, Вам нужно срочно найти человека который умеет читать код написанный на С# или самому прочитать пару абзацев по данному языку


PM MAIL   Вверх
Sergey_P
Дата 18.9.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007

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



весь мой опыт в 7 дельфи, и вот мне срочно надо написать рабочее приложение на C#, а 2 недели назад я первый раз запустил студию  smile 


в общем могу и поразбираться, только пока не до этого ...спасибо за совет
PM MAIL   Вверх
iad
Дата 18.9.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Sergey_P @  18.9.2007,  19:21 Найти цитируемый пост)
весь мой опыт в 7 дельфи,
 А какая разница? Все ОО языки одного уровня - одинаковы. void SetBrightness( int offset) - метод меняющий яркость битмапа, offset - значение в байтах, на которое нужно поменять яркость

Это сообщение отредактировал(а) iad - 18.9.2007, 18:52
PM MAIL   Вверх
Sergey_P
Дата 18.9.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 6.9.2007

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



может это только у меня, когда осн процедура

Код

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(_bmpSrc, 0, 0);  
        }


яркость исходная, пример работает

а если добавить перед либо после SetBrightness(100); (пробовал и так и так, хотя как я понял верно именно до рисования графики в e.Graphics.DrawImage) то приложение задумывается и не прорисовается картинка, либо без изменений в яркости(если после изм графику)
...хотя приложение в любом случае задумывается


просто мне хочется запустить пример и посмотреть на рабочем примере, а потом уже вникать.... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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