Многопоточная обработка изображений - C#
Формулировка задачи:
Приложение должно обеспечивать запуск до 10 потоков, обрабатывающих до 10 различных изображений (размер и вид изображений могут быть разными). Организация многопоточности производится средством, Async Delegate.
Для каждого потока должно быть посчитано время выполнения. Программа должна выводить результат в виде:
- имя файла изображения1, ширина изображения1, высота изображения1, время обработки
- имя файла изображения2, ширина изображения2, высота изображения2, время обработки
….
По результатам параллельной обработки 10 различных изображений построить график зависимости времени работы алгоритма от площади изображения.
Programm.cs
IImageHendler.cs
Gistogramma.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); } } }
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); } }
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("Обработка твоего изображения"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д