Всем добрый вечер. Писал код, при помощи которого можно было бы преобразовать RGB в HSL и разделить изображение собственно на 3 отдельных канала HSL, чтобы потом выводить по отдельности. Формулы собственно взяты из википедии, по идее должно быть правильно, хотя я конечно мог налажать с выводом изображений в picturebox. Но мне выводит ошибку: System.ArgumentException: “Значение ‘300’ недопустимо для ‘red’. ‘red’ должно быть больше или равно 0 и меньше или равно 255.”
А, если я, например, скрываю h, то выводятся как бы две картинки, чисто залитые черным цветом. Подскажите пожалуйста, как можно испраить.
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;
using TgaLib;
using System.IO;
namespace kursovKIT
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void firstimage_Click(object sender, EventArgs e)
{
}
private void tgasave_Click(object sender, EventArgs e)
{
Image image = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.jpg");
string filename = Path.GetFileName("D:/Программы/kursovKIT/kursovKIT/image.jpg");
image.Save("D:/Программы/kursovKIT/kursovKIT/image.tga");
Image imagenew = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga");
firstimage.SizeMode = PictureBoxSizeMode.StretchImage;
firstimage.Image = imagenew;
}
private void pcxsave_Click(object sender, EventArgs e)
{
Image image = Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga");
image.Save("D:/Программы/kursovKIT/kursovKIT/image.pcx");
MessageBox.Show("Сохранение выполнено успешно");
}
private void hls_Click(object sender, EventArgs e)
{
int i, j;
var image = new Bitmap(firstimage.Image);
Bitmap[] result = new Bitmap[] { new Bitmap(image.Width, image.Height), new Bitmap(image.Width, image.Height), new Bitmap(image.Width, image.Height) };
int width = image.Width;
int height = image.Height;
byte[,] image_matr;
image_matr = new byte[width,height];
for (i = 0; i < width; i++)
{
for (j = 0; j < height; j++)
{
Color color = image.GetPixel(i, j);
int R = Convert.ToInt32(color.R)/255;
int G = Convert.ToInt32(color.G) / 255;
int B = Convert.ToInt32(color.B) / 255;
double max = Math.Max(R, Math.Max(G, B));
double min = Math.Min(R, Math.Min(G, B));
double del = max-min;
double h=0, s=0, l;
if (image_matr[i, j] > 255)
image_matr[i, j] = 255;
if (image_matr[i, j] < 0)
image_matr[i, j] = 0;
l = (max + min) / 2.0;
if (del==0)
{ h = 0; //undefined
}
else if(max==R && G>=B)
{ h = 60.0 * (G - B) / (max - min); }
else if (max == R && G < B)
{ h = 60.0 * (G - B) / (max - min) + 360.0; }
else if (max == G)
{ h = 60.0 * (B - R) / (max - min) + 120.0; }
else if (max == B)
{ h = 60.0 * (R - G) / (max - min) + 240.0; }
if (l == 0 || max == min)
{ s = 0; }
else if (l>0 && l <= 0.5)
{ s = (max - min) / (max + min); }
else if (l<1 && l>0.5)
{ s = (max - min) / (2 - (max + min)); }
if (h < 0)
h =h+360;
h = Math.Round(h);
s = Math.Round(s);
l = Math.Round(l);
int H = Convert.ToInt32(h);
int S = Convert.ToInt32(s);
int L= Convert.ToInt32(l);
result[0].SetPixel(i, j, Color.FromArgb(color.A, H, 0, 0));
result[1].SetPixel(i, j, Color.FromArgb(color.A, 0, S, 0));
result[2].SetPixel(i, j, Color.FromArgb(color.A, 0, 0, L));
}
}
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = result[0];
pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox2.Image = result[1];
pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox3.Image = result[2];
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
}
private void R_Click(object sender, EventArgs e)
{
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void pictureBox2_Click(object sender, EventArgs e)
{
}
private void pictureBox3_Click(object sender, EventArgs e)
{
}
private void filtr3_Click(object sender, EventArgs e)
{
double[,] core = new double[3, 3] { { -1, -2, -1 },
{ -2, 13, -2 },
{ -1, -2, -1 } };
// Bitmap bmp1 = new Bitmap(Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga"));
int[] calc_color(Bitmap bmp1, Color a_color, int i, int j, int k, int h)
{
int[] a_RGB = new int[3];
a_color = bmp1.GetPixel(i, j);
a_RGB[0] = Convert.ToInt32(a_color.R * core[k, h]);
a_RGB[1] = Convert.ToInt32(a_color.G * core[k, h]);
a_RGB[2] = Convert.ToInt32(a_color.B * core[k, h]);
return a_RGB;
}
void metod()
{
Bitmap bmp1 = (Bitmap)(Image.FromFile("D:/Программы/kursovKIT/kursovKIT/image.tga"));
int[] a_RGB = new int[3];
int sum_R = 0, sum_G = 0, sum_B = 0;
Color col, a_color = Color.Black;
for (int i = 1; i < bmp1.Width - 1; i++)
for (int j = 1; j < bmp1.Height - 1; j++)
{
// sum_R = 0; sum_G = 0; sum_B = 0;
a_RGB = calc_color(bmp1, a_color, i - 1, j - 1, 0, 0);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i - 1, j, 0, 1);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i - 1, j + 1, 0, 2);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i, j - 1, 1, 0);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i, j, 1, 1);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i, j + 1, 1, 2);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i + 1, j - 1, 2, 0);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i + 1, j, 2, 1);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
a_RGB = calc_color(bmp1, a_color, i + 1, j + 1, 2, 2);
sum_R += a_RGB[0]; sum_G += a_RGB[1]; sum_B += a_RGB[2];
if (sum_R < 0) sum_R = 0;
if (sum_R >= 256) sum_R = 255;
if (sum_G < 0) sum_G = 0;
if (sum_G >= 256) sum_G = 255;
if (sum_B < 0) sum_B = 0;
if (sum_B >= 256) sum_B = 255;
col = Color.FromArgb(sum_R, sum_G, sum_B);
bmp1.SetPixel(i, j, col);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = bmp1;
bmp1.Save("D:/Программы/kursovKIT/kursovKIT/imagematr.jpg", bmp1.RawFormat);
}
}
}
private void delete_Click(object sender, EventArgs e)
{
pictureBox1.Image = null;
pictureBox2.Image = null;
pictureBox3.Image = null;
}
}
}