Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Работа с классом Bitmap


Автор: Rusel 9.9.2007, 21:45
Мне нужно запрограмировать алгоритмы обработки цифровых зобржений на примере Bitmap. Смысл в том чтобы открыть Bitmap, обработать его и вывести на экран. И у меня возникла проблема: я не могу програмно изменить яркость отдельно взятого пиксела. Подскажите если кто с этим сталкивался, как это сделать.

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

Код

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

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

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


Автор: Rusel 10.9.2007, 22:09
Цитата

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

Есть небольшая проблема с SetPixel.... Bitmap с indexed pixel format не поддерживает SetPixel. А мне нужно обработать именно такие картинки

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

Автор: Sergey_P 18.9.2007, 11:31
у кого-нить есть пример, где описана обработка каждого пикселя на экране по сложным формулам

то есть получил пиксель по координатам X, Y ..получил отдельно значения красного, зеленого, синего; потом обработал каждый пиксель и сохранил обратно  smile  smile 

Автор: iad 18.9.2007, 13:08
Вот реализация стандартного алгоритма изменения яркости. Для других преобразований - аналогично, только идет другое заполнение 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);
        }
    }

Автор: Sergey_P 18.9.2007, 15:50
сорри за непонятливость, а чего менять, чтобы яркость изменилась?

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

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


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


в общем могу и поразбираться, только пока не до этого ...спасибо за совет

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

Автор: Sergey_P 18.9.2007, 23:08
может это только у меня, когда осн процедура

Код

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


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

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


просто мне хочется запустить пример и посмотреть на рабочем примере, а потом уже вникать.... 

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