Вывод изображения - 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);