Witam,
Na zadanie z programowania potrzebuję zrobić program, w którym wybieramy dowolny folder i na każdy plik w tym folderze o rozszerzeniu .jpg mają być nakładane 3 różne filtry. Filtry mają wykonywać się równolegle. Znalazłem na internecie jakieś proste filtry, jednak problem polega na tym, że filtrowanie zachodzi dla bitmap, a nie dla obrazu (Image). Czy jest jakiś sposób, aby to naprawić? Proszę o jak najszybszą pomoc.
Poniżej załączam kod źródłowy:
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 System.IO;
using System.Threading;
namespace Filtrowanie
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void wczytaj_Click(object sender, EventArgs e)
{
DialogResult result = folderBrowserDialog1.ShowDialog();
if (result == DialogResult.OK)
{
DirectoryInfo dir = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
FileInfo[] fi = dir.GetFiles("*.jpg");
List<FilterImage> obrazki = new List<FilterImage>();
FilterImage filterImage = new FilterImage();
foreach (var item in fi)
{
Image obrazek = Image.FromFile(item.FullName);
FilterImage temp = new FilterImage();
temp.obraz = obrazek;
obrazki.Add(temp);
}
foreach (var item in fi)
{
filterImage.runParallel();
}
foreach (var item in fi)
{
filterImage.runStrict();
}
}
}
}
class FilterImage
{
public Image obraz;
public bool flaga = false;
int licznik = 0;
void applyFilter1(Bitmap obraz)
{
for (int i=0; i<obraz.Width; i++)
{
for (int j=0; j<obraz.Height; j++)
{
Color c1 = obraz.GetPixel(i, j);
int r1 = c1.R;
int g1 = c1.G;
int b1 = c1.B;
int gray = (byte)(.299 * r1 + .587 * g1 + .114 * b1);
r1 = gray;
g1 = gray;
b1 = gray;
obraz.SetPixel(i, j, Color.FromArgb(r1, g1, b1));
}
}
//filter(obraz);
/*licznik++;
if (licznik == 3) flaga = true;*/
}
void applyFilter2()
{
//filter2(obraz);
licznik++;
if (licznik == 3) flaga = true;
}
void applyFilter3()
{
//filter3(obraz);
licznik++;
if (licznik == 3) flaga = true;
}
public void runParallel()
{
Thread th1 = new Thread(applyFilter1);
Thread th2 = new Thread(applyFilter2);
Thread th3 = new Thread(applyFilter3);
th1.Start();
th2.Start();
th3.Start();
}
public void runStrict()
{
applyFilter1();
applyFilter2();
applyFilter3();
}
}
}