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();
        }

    }
}