Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126

Как правильно назначить цветовой профиль

19.08.2019, 11:34. Показов 2571. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите разобраться с назначением цветового профиля в picturebox. Бьюсь уже неделю, результат неудовлетворительный. Собственно, профиль назначается, но Очень медленно работает.
Вот что у меня получилось после всех моих изысканий:
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
        private void oprnToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            if (openFileDialog1.FileName != "")
            {
                string FileName = openFileDialog1.FileName;
                this.Text += " " + FileName;
                pictureBox1.Image = (Bitmap)Image.FromFile(FileName);
                pic = (Bitmap)pictureBox1.Image;
            }
            
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            progressBar1.Maximum = pic.Height * pic.Width;
            string pathProfil = "D:\\MyProg\\cvetoprof\\JapanColor2002Newspaper.icc";
            for (int i = 0; i < pic.Height; i++)
            {
                for (int j = 0; j < pic.Width; j++)
                {
                    System.Drawing.Color clr = new System.Drawing.Color();
                    clr = pic.GetPixel(j, i);
                    clr.ToArgb();
                    float a0 = clr.A;
                    float r0 = clr.R;
                    float g0 = clr.G;
                    float b0 = clr.B;
 
                    System.Windows.Media.Color color;
                    color = FromValueProfile(a0, r0, g0, b0, pathProfil);
                    System.Drawing.Color newColor = System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
 
                    pic.SetPixel(j, i, newColor);
 
                    //без точных измерений, но с виду работает примерно с той же скоростью, что и SetPixel...
                    //using (SolidBrush sb = new SolidBrush(newColor))
                    //{
                    //    Graphics g = pictureBox1.CreateGraphics();
                    //    g.FillRectangle(sb, j, i, 1, 1);
                    //}
                    progressBar1.Value += 1;
                }
            }
            pictureBox1.Refresh();
            pic.Save("D:\\MyProg\\Test\\myfile.tif", ImageFormat.Tiff);
        }
 
        //НАЗНАЧЕНИЕ ПРОФИЛЯ (основной "тормоз" программы)
        private System.Windows.Media.Color FromValueProfile(float a1, float r1, float g1, float b1, string path_ICC)
        {
            System.Windows.Media.Color myValuesColor = new System.Windows.Media.Color();
            float[] colorValues = new float[4];
            colorValues[0] = a1;
            colorValues[1] = g1;
            colorValues[2] = b1;
            colorValues[2] = b1;
 
            Uri myIccUri = new Uri(path_ICC);
 
            myValuesColor = System.Windows.Media.Color.FromValues(colorValues, myIccUri);
 
 
            return myValuesColor;
        }
На картинке 20 *20 пикселей этот фокус срабатывает, но при загрузке картинки размера хотя бы 800*450 ему нужно почти полчаса на обработку изображения. Притом, "тормозит" метод "FromValueProfile". Без этого метода (просто проход по картинке GetPixel и SetPixel) проходит быстро (сравнительно с методом "FromValueProfile").
Подскажите, пожалуйста, может как-то по другому можно назначить цветовой профиль, или просто код можно как-то оптимизировать. Вторые сутки не сплю, идей больше нет.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.08.2019, 11:34
Ответы с готовыми решениями:

Как восстановить цветовой профиль монитора
Сделал калибровку программой i1Profiler и спекриком x-rite I1 pro, софтина i1Profiler наглухо перезаписался цветовой профиль монитора....

Цветовой профиль и экспорт
Добрый вечер, помогите пожалуйста разъяснить вопрос. Вот есть файл CDR сделанный возможно в Х6, а может и в Х7, у меня стоит Х7, но мне...

Цветовой профиль для Epson P50 СНПЧ InkSystem
Беда с печатью, никак не получается настроить печать корректно... Бумага: jet print A4 глянец 230мг, 10х15 матовая и глянцевая 200 г/м...

5
91 / 65 / 18
Регистрация: 09.12.2015
Сообщений: 207
20.08.2019, 11:25
Что вы пытаетесь сделать? Изменить цвет фона?
0
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
20.08.2019, 11:52  [ТС]
Я пытаюсь назначить цветовой профиль к открытой картинке, как в фотошопе — выбрал цветовой профиль и цветовое пространство изменилось... Просто эта программа для типографии, и очень важно сделать поддержку цветовых профилей в данной программе. Если профиль CMYK, то алгоритм, думаю, нужно будет еще усложнить, добавить формулу преобразования RGB — CMYK, но это будет дальнейшей задачей, сейчас нужно просто сменить профиль открытой картинки.
0
91 / 65 / 18
Регистрация: 09.12.2015
Сообщений: 207
20.08.2019, 12:34
Лучший ответ Сообщение было отмечено Keramer82 как решение

Решение

С ICC профилем изображения работает imagemagick. Возможно проще использовать эту библиотеку.
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
20.08.2019, 22:56  [ТС]
Попробовал, он что-то делает, но ничего происходит. Временный файл ничем не отличается от оригинального. С изображением в picturebox тоже ничего не происходит. Помогите разобраться, пожалуйста.
Вот код, который теперь висит на кнопке. (pic — изображение подгружаемое в picturebox на openFileDialog1)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private void button1_Click(object sender, EventArgs e)
        {
            using (MagickImage image = new MagickImage(pic))
            {
                MagickReadSettings settings = new MagickReadSettings();
                settings.ColorSpace = ColorSpace.CMYK;
                image.AddProfile(new ColorProfile("D:\\MyProg\\cvetoprof\\JapanColor2002Newspaper.icc"));
                image.Read(openFileDialog1.FileName, settings);
                string tempFile = "D:\\MyProg\\Test\\tempFile.tiff";
                image.Write(tempFile);
 
                pictureBox1.Image = (Bitmap)Image.FromFile(tempFile);
                pic = (Bitmap)pictureBox1.Image;
                pictureBox1.Refresh();
                this.Text += " " + " *JapanColor2002Newspaper";
            }
        }
Добавлено через 3 часа 39 минут
А ларчик просто открывался... Как и всегда.
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
            using (MagickImage image = new MagickImage(pic))
            {
                //Определение текущего цветового профиля
                ColorProfile tempColorProfil;
                tempColorProfil = image.GetColorProfile();
                if (tempColorProfil != null)
                {
                    image.AddProfile(tempColorProfil);
                }
                //Попадаются файлы без профиля
                if (tempColorProfil == null)
                {
                    image.AddProfile(ColorProfile.SRGB);
                }
                // Добавление профиля в который нужно конвертировать
                image.AddProfile(new ColorProfile("D:\\MyProg\\cvetoprof\\JapanColor2002Newspaper.icc"));
                // запись временного файла
                image.Write("D:\\MyProg\\Temp\\tempFile.tiff");
 
                //Чтение из временного файля для отображения в picturebox
                pictureBox1.Image = (Bitmap)Image.FromFile("D:\\MyProg\\Temp\\tempFile.tiff");
                pic = (Bitmap)pictureBox1.Image;
                pictureBox1.Refresh();
                this.Text += " " + " *JapanColor2002Newspaper";
            }
Хоть в CMYK хоть в RGB!
Единственно, преобразование больше соответствует преобразованию в фотошопе, если выбрать метод "перцепционный", а хотелось бы относительный колориметрический, но это, думаю, уже отдельная история. Хотя, если у кого-нибудь есть какие-то соображения по этому поводу, буду очень рад. Так же, буду не против, если кто-нибудь поможет "причесать" код, то есть привести его к более профессиональному виду, так как программированием я занимаюсь меньше месяца и многого просто не знаю, занимаюсь, так сказать, самообразованием.
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
21.08.2019, 22:02  [ТС]
Возникла проблема с закрытием записи в файл ImgeMagick.
Вот эта строка при повторном применении профиля вываливается в ошибку:
C#
1
image.Write("D:\\MyProg\\Temp\\tempFile.tiff");
так как файл после записи не закрыт. Может кто работал с этой библиотекой, как закрыть запись файла?
C#
1
image.Dispose();
почему-то не помогает...

Добавлено через 2 минуты
пока, думаю, можно решить проблему записью в несколько файлов с именем + индекс (чтобы были разные имена файлов), но это будет костыль.

Добавлено через 5 часов 5 минут
А нет, оказалось я сам затупил. Основная проблема, как оказалось сидит за компьютером. Это строка
C#
1
pictureBox1.Image = (Bitmap)Image.FromFile("D:\\MyProg\\Temp\\tempFile.tiff");
не давала перезаписывать файл. Переделал, на этом, думаю, закончу с профилированием изображений в своем графическом редакторе. После строки
C#
1
image.Write("D:\\MyProg\\Temp\\tempFile.tiff");
Добавил (оказалось, все-таки работает)
C#
1
image.Dispose();
Ну и дальше, за пределами
C#
1
using (MagickImage image = new MagickImage(pic))
переделал (пришлось добавить еще 1 временный битмап):
C#
1
2
3
4
5
6
                //Чтение из временного файля для отображения в picturebox
                FileStream fs = new FileStream("D:\\MyProg\\Temp\\tempFile.tiff", FileMode.Open);
                Image img = Image.FromStream(fs);
                pictureBox1.Image = img;
                fs.Close();
                tmpBmp = (Bitmap)pictureBox1.Image;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2019, 22:02
Помогаю со студенческими работами здесь

Как назначить правильно селектор?
Как правильно назначить селектор активным ссылкам из меню &lt;nav&gt; &lt;menu&gt; &lt;li...

Как правильно создать профиль групп доступа
Всем привет! Подскажите как надо правильно создать профиль групп доступа? Версия 1С предприятия 8.3.4.437 Ут 11.1.1.13 Стандартные...

Как правильно назначить версию для программы
Пишу приложение под андроид, ни разу до этого не писал. На данный момент бета-версия претерпела 9 принципиальных изменений. Подскажите как...

Как правильно назначить процедуру в параметрах компонента?
Вот объявлена процедура: procedure ScrollSb1(var Up: boolean); Вот она описана: procedure TForm1.ScrollSb1(var Up: Boolean); begin ...

Как правильно назначить VLAN серверам в топологии (Cisco)
Новичок просит о помощи! У меня есть сетка, в которой несколько серверов: Web, хранилище и dhcp с dns. Мне нужно им как-то назначить...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru