Вывод изображения - C# (185367)
Формулировка задачи:
Здравствуйте. Передо мной стоит следующая задача - провести дискретное вейвлет-преобразование изображения методом Хаара. Я работаю следующим образом - выделяю RGB компоненты и записываю полученные значения в соответствующие вещественные массивы. Далее выполняются некоторые преобразования (пока что они реализованы для одного массива - просто сделал для примера), после которых необходимо значения массива, которые получены в итоге, записать по пикселям, что я пытался сделать следующим образом
но появляется ошибка "Не удается явно преобразовать тип int в System.Drawing.Color".
Как можно справиться с этой проблемой? Или нужно вообще действовать по иному принципу? И как в итоге вывести полученные результаты в виде преобразованного изображения?
Весь код представлен ниже.
for (i = 0; i < img.Height; i++) { for (j = 0; j < img.Width; j++) { Color pixel = img.GetPixel(j, i); if (i < img.Height && j < img.Width) { pixel = dvp[i, j]; Console.WriteLine("R = [" + i + "][" + j + "] = " + Rcomponent[i, j]); } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void buttonOpenFile_Click(object sender, EventArgs e) { OpenFileDialog openDialog = new OpenFileDialog(); openDialog.Filter = "Image Files (*.jpg; *.png; *.bmp)| *.jpg; *.png; *.bmp"; if (openDialog.ShowDialog() == DialogResult.OK) { textBoxFilePath.Text = openDialog.FileName.ToString(); pictureBox1.ImageLocation = textBoxFilePath.Text; } } private void buttonEncode_Click(object sender, EventArgs e) { Bitmap img = new Bitmap(textBoxFilePath.Text); float[,] Rcomponent = new float[img.Height, img.Width]; float[,] Gcomponent = new float[img.Height, img.Width]; float[,] Bcomponent = new float[img.Height, img.Width]; float[,] Gdopcomponent = new float[img.Height, img.Width]; float[,] Bdopcomponent = new float[img.Height, img.Width]; int i, j, m, n, b, k, l, r, doc, t, sh, sh1; for (i = 0; i < img.Height; i++) { for ( j = 0; j < img.Width; j++) { Color pixel = img.GetPixel(j, i); if (i < img.Height && j < img.Width) { Rcomponent[i, j] = pixel.R; Gcomponent[i, j] = pixel.G; Bcomponent[i, j] = pixel.B; //pixel = Rcomponent[i, j]; Console.WriteLine("R = [" + i + "][" + j + "] = " + Rcomponent[i, j]); Console.WriteLine("G = [" + i + "][" + j + "] = " + Gcomponent[i, j]); Console.WriteLine("B = [" + i + "][" + j + "] = " + Bcomponent[i, j]); } } } //Разбиение на интервалы по строкам m = img.Height; n = img.Width; t = n; for (i = 0; i < img.Height; i++) { r = t; k = t; l = t; doc = 0; for (j = 0; j < k; j++) { if (l % 2 != 0 && l > 1) { l++; //cout << l << endl; l /= 2; doc++; //cout << l << endl; } else if (l % 2 == 0 && l > 1) { l /= 2; doc++; } if (l == 1) { while (doc > 0) { l *= 2; n = l; doc--; } } } } //cout << "n:" << n << endl; //b=1; float[,] Rdopcomponent = new float[img.Height, n]; k = t; for (i = 0; i < img.Height; i++) { b = 1; for (j = 0; j < n; j++) { if (j >= k) { Rdopcomponent[i, j] = Rcomponent[i, j - b]; b += 2; } else { Rdopcomponent[i, j] = Rcomponent[i, j]; } Console.Write(Rdopcomponent[i, j]); } Console.WriteLine (""); } Console.WriteLine(""); //Разбиение на интервалы по столбцам t = m; for (j = 0; j < n; j++) { r = t; k = t; l = t; doc = 0; for (i = 0; i < img.Height; i++) { if (l % 2 != 0 && l > 1) { l++; //cout << l << endl; l /= 2; doc++; //cout << l << endl; } else if (l % 2 == 0 && l > 1) { l /= 2; doc++; } if (l == 1) { while (doc > 0) { l *= 2; m = l; doc--; } } } } // cout << "m:" << m << endl; float[,] Rdop1component = new float[m, n]; //b=1; for (j = 0; j < n; j++) { b = 1; for (i = 0; i < m; i++) { if (i >= k) { Rdop1component[i,j] = Rdopcomponent[i - b, j]; b += 2; } else Rdop1component[i, j] = Rdopcomponent[i,j]; //Console.Write(Rdop1component[i, j]); } //Console.WriteLine(); } for (i = 0; i < m; i++) { b = 1; for (j = 0; j < n; j++) { Console.Write(Rdop1component[i, j]); } Console.WriteLine(); } Console.WriteLine(""); Console.WriteLine(""); //<----Преобразование Хаара по строкам----> float[,] mas = new float[m, n]; sh1 = 0; for (i = 0; i < m; i++) { t = n; // cout << "t:" << t << endl; while (t > 1) { sh1++; //k=t; r = 0; for (j = t / 2; j < t; j++) { Rdop1component[i, j] = (mas[i, j - (t / 2) + r] - mas[i, j - (t / 2) + 1 + r]) / 2; r++; } k = t / 2; r = 0; for (j = 0; j < k; j++) { Rdop1component[i, j] = (mas[i, j + r] + mas[i, j + r + 1]) / 2; //cout<<c[i][j]<<endl; r++; } // cout << "massiv:" << endl; for (j = 0; j < n; j++) { mas[i, j] = Rdop1component[i, j]; //printf("%6.1f", mas[i][j]); } // cout << endl; t = t / 2; // cout << "t:" << t << endl; } } sh1 /= m; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { Console.Write(Rdop1component[i, j]); } Console.WriteLine(); } Console.WriteLine(""); Console.WriteLine(""); //<----Преобразование Хаара по столбцам----> sh = 0; for (j = 0; j < n; j++) { t = m; //cout << "t:" << t << endl; while (t > 1) { sh++; //k=t; r = 0; for (i = t / 2; i < t; i++) { Rdop1component[i, j] = (mas[i - (t / 2) + r, j] - mas[i - (t / 2) + 1 + r, j]) / 2; r++; } k = t / 2; r = 0; for (i = 0; i < k; i++) { Rdop1component[i, j] = (mas[i + r, j] + mas[i + r + 1, j]) / 2; //cout<<c[i][j]<<endl; r++; } // cout << "massiv:" << endl; for (i = 0; i < m; i++) { mas[i, j] = Rdop1component[i, j]; //printf("%6.1f", mas[i][j]); } //cout << endl; t = t / 2; // cout << "t:" << t << endl; //sh++; // cout << "sh:" << sh << endl; } } sh /= n; //cout << "sh" << sh << //Вывод ДВП-матрицы for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { mas[i, j] = Rdop1component[i ,j]; Console.Write(Rdop1component[i, j]); } Console.WriteLine(); } int[,] dvp = new int[m, n]; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { dvp[i, j] = (int)Rdop1component[i, j]; Console.Write(Rdop1component[i, j]); } Console.WriteLine(); } for (i = 0; i < img.Height; i++) { for (j = 0; j < img.Width; j++) { Color pixel = img.GetPixel(j, i); if (i < img.Height && j < img.Width) { pixel = dvp[i, j]; Console.WriteLine("R = [" + i + "][" + j + "] = " + Rcomponent[i, j]); } } } } } }
Решение задачи: «Вывод изображения»
textual
Листинг программы
var v = (int)(dwp[i, j] + 255)/2;//здесь значение dwp приводится к диапазону 0-255, исходя из условия что -255<dwp<255. Если диапазон другой, то и преобразование должно быть другое var c = Color.FromArgb(v, v, v); img.SetColor(i, j, c);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д