Многопоточная обработка изображений - C#

Узнай цену своей работы

Формулировка задачи:

Приложение должно обеспечивать запуск до 10 потоков, обрабатывающих до 10 различных изображений (размер и вид изображений могут быть разными). Организация многопоточности производится средством, Async Delegate. Для каждого потока должно быть посчитано время выполнения. Программа должна выводить результат в виде: - имя файла изображения1, ширина изображения1, высота изображения1, время обработки - имя файла изображения2, ширина изображения2, высота изображения2, время обработки …. По результатам параллельной обработки 10 различных изображений построить график зависимости времени работы алгоритма от площади изображения. Programm.cs
using System;
using ImageProcessingLibrary;
using System.Drawing;
using System.Drawing.Imaging;
using System.Diagnostics;
using ImageProcessingTest;
 
namespace ImageProcessingTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Clear();
 
            Stopwatch sw = new Stopwatch();
 
            Bitmap src = new Bitmap("example.jpg");
 
            IImageHandler handler = new Gistogramma();
            handler.Source = src;
 
            Console.WriteLine(handler.HandlerName);
 
            handler.Source = src;
 
            sw.Reset();
 
            sw.Start();
 
            handler.startHandle(new ProgressDelegate(showProgress));            
 
            sw.Stop();
 
            long time1 = sw.ElapsedMilliseconds;
 
            handler.Result.Save("out1.jpg", ImageFormat.Jpeg);
 
            Console.WriteLine("\nPress any key");
 
            Console.ReadLine();
 
            Console.Clear();
 
            sw.Reset();
 
            sw.Start();
        
        }
 
        static void showProgress(double progress)
        {
 
            Console.SetCursorPosition(0, 1);
 
            Console.Write("{0,4:F}%", progress);
 
        }
    }
}
IImageHendler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
 
namespace ImageProcessingLibrary
{
 
    //Указатель на функцию обработки прогресса выполнения задачи
    public delegate void ProgressDelegate(double precent);
 
    public interface IImageHandler
    {        
        //получение осмысленного имени обработчика
        string HandlerName { get; }
 
        //Инициализация параметров обработчика
        void init(SortedList<string, object> parameters);
 
        //Установка изображения-источника
        Bitmap Source { set; }
 
        //Получение изображения-результата
        Bitmap Result { get; }
 
        //Запуск обработки
        void startHandle(ProgressDelegate progress);

    }
 
}
Gistogramma.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
 
using ImageProcessingLibrary;
 
namespace ImageProcessingLibrary
{
    public class Gistogramma : IImageHandler
    {
 
        private const string HANDLER_NAME = "Postroenie gistogramm";
 
        private Bitmap bitmap;

        public string HandlerName
        {
            get { return HANDLER_NAME; }
        }

        public void init(SortedList<string, object> parameters)
        {
 
        }

        public Bitmap Source
        {
            set { bitmap = value; }
        }

        public Bitmap Result
        {
            get { return bitmap; }
        }
 
        //Запуск обработки
        public void startHandle(ProgressDelegate progress)
        {
            var R = new byte[256]; // Red
            var G = new byte[256]; // Green
            var B = new byte[256]; // Blue
 
            for (int i = 0; i < bitmap.Width; i++)
            {
                progress((double)i * 40.0 / bitmap.Width);
 
                for (int j = 0; j < bitmap.Height; j++)
                {
                    Color color = bitmap.GetPixel(i, j);
 
                    ++R[color.R]; // Подсчитываем кол-во оттенков красного
                    ++G[color.G]; // Подсчитываем кол-во оттенков зеленого
                    ++B[color.B]; // Подсчитываем кол-во оттенков синего
                }
            }
 
            long max = 0;
 
            for (int i = 0; i < 256; i++) // Всего 256
            {
                if (R[i] > max)
                {
                    max = R[i];
                }
 
                if (G[i] > max)
                {
                    max = G[i];
                }
 
                if (B[i] > max)
                {
                    max = B[i];
                }
            }
 
            Bitmap red = new Bitmap(1024, 768);
 
            for (int i = 0; i < 256; i++)
            {
                progress((double)i * 20.0 / 256 + 40);
 
                Color temp = Color.FromArgb(255, 0, 0);
 
                for (int j = 0; j < R[i] * 768 / max; j++)//подгон высоты для высоты изображения
                {
                    for (int k = i * 4; k < i * 4 + 4; k++)//ширина столбика
                    {
                        red.SetPixel(k, 767 - j, temp);//закраска
                    }
                }
            }
 
            Bitmap green = new Bitmap(1024, 768);
 
            for (int i = 0; i < 256; i++)
            {
                progress((double)i * 20.0 / 256 + 60);
 
                Color temp = Color.FromArgb(0, 255, 0);
 
                for (int j = 0; j < G[i] * 768 / max; j++)
                {
                    for (int k = i * 4; k < i * 4 + 4; k++)
                    {
                        green.SetPixel(k, 767 - j, temp);
                    }
                }
            }
 
            Bitmap blue = new Bitmap(1024, 768);
 
            for (int i = 0; i < 256; i++)
            {
                progress((double)i * 20.0 / 256 + 80.08);
 
                Color temp = Color.FromArgb(0, 0, 255);
 
                for (int j = 0; j < B[i] * 768 / max; j++)
                {
                    for (int k = i * 4; k < i * 4 + 4; k++)
                    {
                        blue.SetPixel(k, 767 - j, temp);
                    }
                }
            }
 
            red.Save("red.bmp", ImageFormat.Bmp);
            green.Save("green.bmp", ImageFormat.Bmp);
            blue.Save("blue.bmp", ImageFormat.Bmp);
        }
    }
}

Решение задачи: «Многопоточная обработка изображений»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Threading;
 
namespace ConsoleApplication2
{
    class Program
    {
        private delegate void AsyncDelegate(Bitmap bitmap);
 
        private static IEnumerable<string> GetFileName(StreamReader reader)
        {
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
        }
 
        static void Main(string[] args)
        {
            var pathToDirectoryImages = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images");
            using (var reader = File.OpenText("listImage.txt"))
                GetFileName(reader).ToList().ForEach(imageFileName =>
                    {
                        AsyncDelegate asyncDelegate = ImageProcessing;
                        var pathToImageFile = Path.Combine(pathToDirectoryImages, imageFileName);
                        var image = new Bitmap(pathToImageFile);
                        var start = DateTime.Now.Ticks;
                        asyncDelegate.BeginInvoke(image, ar =>
                            {
                                asyncDelegate.EndInvoke(ar);
                                var end = DateTime.Now.Ticks;
                                Console.WriteLine("Время обработки изображения: {0}", new TimeSpan(end - (long)ar.AsyncState));
                            }, start);
                    });
            Console.ReadLine();
        }
 
        private static void ImageProcessing(Bitmap image)
        {
            // обработка твоего изображения
            Console.WriteLine("Обработка твоего изображения");
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4 из 5
Похожие ответы