Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92

Пример создания нового экземпляра Bitmap

31.01.2016, 20:29. Показов 8389. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Нашла хороший пример работы с Bitmap на msdn (вот тут https://msdn.microsoft.com/ru-... s.90).aspx).
Прошу помочь мне уразуметь, что происходит в программе на этом этапе:
C#
1
2
3
4
5
6
7
8
9
 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);
            }
        }
Циклы "пробегают" всю картинку и ............ задают новый цвет? А как сделать так чтобы можно было менять баланс R,G и B в картинке? Заранее спасибо за советы
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.01.2016, 20:29
Ответы с готовыми решениями:

Привести пример программы создания нового файла и связывания с ним файлового потока
using System; using System.Text; using System.IO; //для работы с файловым вводом-выводом namespace MyProgram { class...

Простой пример создания нового потока с интерфейсом Runnable
public class theThread implements Runnable{ Thread t; theThread(){ t = new Thread(this, &quot;Demo Thread&quot;); ...

Скрытие\Раскрытие формы за счет метода Hide() без создания нового экземпляра формы
Здраствуйте. Как мне скрыть форму и потом раскрыть ее из другой формы. Мне не нужно создавать каждый раз новую форму. Мне нужно раскрыть ту...

6
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
31.01.2016, 20:56
Цитата Сообщение от Virviglaz
А как сделать так чтобы можно было менять баланс R,G и B в картинке?
ColorMatrix
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
31.01.2016, 23:23
Цитата Сообщение от Virviglaz Посмотреть сообщение
как сделать так чтобы можно было менять баланс R,G и B в картинке?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using System.Windows.Forms;
 
namespace WindowsFormsApplication327
{
    public partial class Form1 : Form
    {
        private Layer layer;
 
        public Form1()
        {
            InitializeComponent();
 
            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
            SetClientSizeCore(500, 500);
 
            layer = new Layer();
            layer.Image = (Bitmap)Image.FromStream(new WebClient { Proxy = null }.OpenRead("http://zanogu.com/img/gentpls/tpl-m-34.jpg"));
 
            new Button { Parent = this, Text = "Color matrix" }.Click += btColorMatrix_Click;
        }
 
        private void btColorMatrix_Click(object sender, EventArgs e)
        {
            var form = new ImageColorMatrixToolForm();
            form.Build(layer);
            form.Changed += delegate { Invalidate(); };
 
            if (form.ShowDialog() == DialogResult.OK)
                layer.Image = new Bitmap(layer.Preview);
 
            layer.Preview = null;
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(layer.Preview ?? layer.Image, ClientRectangle);
        }
    }
 
    internal class ImageColorMatrixToolForm : Form
    {
        private TrackBar tbB;
        private TrackBar tbC;
        private TrackBar tbS;
 
        private Layer layer;
        public event EventHandler Changed = delegate { };
 
        public ImageColorMatrixToolForm()
        {
            tbB = new TrackBar { Parent = this, Top = 50, Maximum = 100, Value = 30 };
            tbC = new TrackBar { Parent = this, Top = 100, Maximum = 100, Value = 30 };
            tbS = new TrackBar { Parent = this, Top = 150, Maximum = 100, Value = 30 };
 
            new Button { Parent = this, Text = "OK", DialogResult = DialogResult.OK };
            new Button { Parent = this, Text = "Cancel", Left = 100, DialogResult = DialogResult.Cancel };
 
            tbB.ValueChanged += tbValueChanged;
            tbC.ValueChanged += tbValueChanged;
            tbS.ValueChanged += tbValueChanged;
        }
 
        private void tbValueChanged(object sender, EventArgs e)
        {
            var r = tbB.Value / 30f;
            var g = tbC.Value / 30f;
            var b = tbS.Value / 30f;
 
            layer.Preview = new ImageColorMatrixTool().Transform(layer.Image, r, g, b);
 
            Changed(this, EventArgs.Empty);
        }
 
        public void Build(Layer layer)
        {
            this.layer = layer;
        }
    }
 
    class Layer
    {
        private Bitmap image;
        public Bitmap Image
        {
            get { return image; }
            set
            {
                if (image != null) image.Dispose();
                image = value;
            }
        }
 
        private Bitmap preview;
        public Bitmap Preview
        {
            get { return preview; }
            set
            {
                if (preview != null) preview.Dispose();
                preview = value;
            }
        }
    }
 
    class ImageColorMatrixTool
    {
        public Bitmap Transform(Image img, float r, float g, float b)
        {
            var imageAttributes = new ImageAttributes();
 
            float[][] colorMatrixElements = { 
               new float[] {r, 0, 0, 0, 0},
               new float[] {0, g, 0, 0, 0},
               new float[] {0, 0, b, 0, 0},
               new float[] {0, 0, 0,1f, 0},
               new float[] {0, 0, 0, 0, 1}};
 
            var colorMatrix = new ColorMatrix(colorMatrixElements);
            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
 
            var result = new Bitmap(img.Width, img.Height);
            using (var gr = Graphics.FromImage(result))
                gr.DrawImage(img,
                           new Rectangle(0, 0, img.Width, img.Height), 0, 0,
                           img.Width, img.Height,
                           GraphicsUnit.Pixel, imageAttributes);
 
            return result;
        }
    }
}
2
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
01.02.2016, 01:11  [ТС]
Storm23, спасибо большое за помощь! Буду разбирать
Сейчас хочу немного показать над чем работала, так как вопросы по данному материалу у меня всё ещё остались.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void button2_Click(object sender, EventArgs e) // красный цвет
        {
            try
            {
                // Retrieve the image.
                image1 = new Bitmap(@"D:п1.bmp", true);
                pictureBox2.Image = image1;
            }
            catch (ArgumentException)
            {
                MessageBox.Show("There was an error." +
            "Check the path to the image file.");
            }
            int x, y, constt=2;
 
            for (x = 0; x < image1.Width; x++)
            {
                for (y = 0; y < image1.Height; y++)
                {
                    int R=image1.GetPixel(x,y).R;
                    Color pixelColor = image1.GetPixel(x, y);
                    image1.SetPixel(x,y,Color.FromArgb(R-constt));
                }
            }
            pictureBox2.Image = image1; // вывод изображение после изменений
        }
В своем программе я решила разбить изменение каждого из цветов на отдельные функции (т.е имеем несколько кнопок с одинаковым кодом. разница только в цвете который изменяем (R,G или B соответственно)). После вызова функций для разных цветов получаю одинаковый результат (скрин прилагается). Почему так? В чём скрыта ошибка и моё глобальное непонимание?
Миниатюры
Пример создания нового экземпляра Bitmap  
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.02.2016, 09:40
Лучший ответ Сообщение было отмечено Virviglaz как решение

Решение

Virviglaz,
1) @"D:п1.bmp" -> @"D:\п1.bmp"
2) Вы используете неправильную перегрузку метода Color.FromArgb. Нужно использовать эту перегрузку: public static Color FromArgb(int red, int green, int blue)
И код внутри цикла следующий:
C#
1
2
3
            var c = image1.GetPixel(x, y);
            var r = Math.Max(0, c.R - constt);
            image1.SetPixel(x, y, Color.FromArgb(r, c.G, c.B));
3) Методы GetPixel и SetPixel - очень медленные. Для более быстой и удобной работы с пикселами рекомендую использовать ImageWrapper.
2
3 / 3 / 1
Регистрация: 21.10.2015
Сообщений: 92
04.02.2016, 20:17  [ТС]
Storm23, а можно к вам опять обратиться за помощью? Как сделать изображение чёрно-белым? Я натыкалась на несколько тем на форуме. В частности почерпнула для себя нужную формулу: Y=(R*77)/255+(G*150)/255+(B*28)/255 (позволяет избегать работы с "плавающей точкой"). Проблема в том как написать это под мою "реализацию". То что я написала чёрно-белым изображение не делает
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.02.2016, 14:43
Цитата Сообщение от Virviglaz Посмотреть сообщение
В частности почерпнула для себя нужную формулу: Y=(R*77)/255+(G*150)/255+(B*28)/255 (позволяет избегать работы с "плавающей точкой"). Проблема в том как написать это под мою "реализацию".
Внутри цикла:
C#
1
2
3
            int p = image1.GetPixel(x, y);
            var gray = (p.R*77)/255 + (p.G*150)/255 + (p.B*28)/255;
            image1.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2016, 14:43
Помогаю со студенческими работами здесь

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

Открытие нового экземпляра формы
Каким образом можно открыть второй экземляр формы. Создана форма1 в которой есть кнопка по которой нужно открыть эту-же форму но с другими...

StackOverflowException при добавление в list<> нового экземпляра
Здравствуйте, уважаемы форумчане! Я начал изучать c# и вообще ООП сравнительно недавно...И вот наткнулся на такую проблему...есть код ...

Непонятный пример экземпляра класса
Что значит? Выходит на 36 строке. Сам код public class delegate { private interface Graphics { void draw(); }

Невозможность создания экземпляра
Не удается создать экземпляр, в чем может быть проблема? Заранее спасибо Вот код: for (int i = 0; i &lt; elements_count;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru