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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наложить цвет поверх изображения. Получить эффект "тёмных очков".см в теме 
V
    Опции темы
CasperSC
Дата 16.5.2010, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть такой агоритм взятый из MSDN:

Код

...
//image1 любая картинка загруженная из файла например.
...
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
               int x, y;

                // Loop through the images pixels to reset color.
                for (x = 0; x < image1.Width; x++)
                {
                    for (y = 0; y < image1.Height; y++)
                    {
                        Color pixelColor = image1.GetPixel(x, y);
                        Color newColor = Color.FromArgb(pixelColor.R, 0, 0);
                        image1.SetPixel(x, y, newColor);
                    }
                }

                // Display the pixel format in Label1.
                label1.Text = "Pixel format: " + image1.PixelFormat.ToString();
                pictureBox1.BackgroundImage = image1;

            }
            catch (ArgumentException)
            {
                MessageBox.Show("There was an error." +
                    "Check the path to the image file.");
            }
        }


user posted image  user posted image

Вот только способ этот выполняется очень долго, может есть побыстрей какой нибудь? Ди и кстати не понятно как окрасить не только в красный, зелёный, синий.

Это сообщение отредактировал(а) CasperSC - 16.5.2010, 16:59
PM MAIL   Вверх
Exception
Дата 16.5.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



GetPixel и SetPixel действительно очень медленные.
Для быстрой работы с изображениями в C# придётся пользоваться unsafe-блоками и указателями.

Вкратце алгоритм такой:
1) Вызываешь метод LockBits ()
2) Работаешь с массивом данных через указатели
3) Вызываешь UnlockBits ()

Google Code Search тебе в помощь.

Это сообщение отредактировал(а) Exception - 16.5.2010, 22:31
PM   Вверх
CasperSC
Дата 16.5.2010, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

...
Graphics gr = Graphics.FromHwnd(this.Handle);
...

Region region = new Region(g.ClipBounds);
region.Exclude(SelectionRect); // Rectangle прямоугольника по середине
g.FillRegion(new Pen(Color.FromArgb(150, Color.White)).Brush, region);


Типа того, что то. Могу дать ссылку на другой форум где подробнее решён вопрос, но правила лень перечитывать, не помню можно, нет?
PM MAIL   Вверх
Exception
Дата 16.5.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если там есть конкретное решение, едва ли ссылка повредит smile
PM   Вверх
CasperSC
Дата 17.5.2010, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Чёто я там посмотрел, нет там толком решения вопроса, проще самому написать тут:
Собственно решение. 
Код

        ...
        Graphics gr;
        Bitmap bmpImg, originalImg;
        ...

        //конструктор формы
        public FormBackgroundScreen(Bitmap bitmapInBackground)
        {
            InitializeComponent();

            //Это изображение оставляем для заливки внутренней части выделяемого прямоугольника
            originalImg = new Bitmap(bitmapInBackground); 
            bmpImg = new Bitmap(bitmapInBackground); //получаем изображение переданное в параметрах
            Graphics graphImg = Graphics.FromImage(bmpImg); //Инициализируем объект Graphics на основе переданного изображения
           
            //красим картинку в цвет которым потом заливать наружнюю область выделения
            graphImg.FillRectangle
                (new Pen(Color.FromArgb(80, GlobalSettings.appSettings.ColorBackScreen)).Brush, rectBack);

            this.BackgroundImage = bmpImg; //Получаем фоновое изображение уже окрашеным


Ну тут "GlobalSettings.appSettings.ColorBackScreen" это какой то цвет, то есть равносильно:

Код

            //красим картинку в цвет которым потом заливать наружнюю область выделения
            graphImg.FillRectangle
                (new Pen(Color.FromArgb(80, Color.White)).Brush, rectBack);


Это сообщение отредактировал(а) CasperSC - 17.5.2010, 06:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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