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

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

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

Приложение должно обеспечивать запуск до 10 потоков, обрабатывающих до 10 различных изображений (размер и вид изображений могут быть разными). Организация многопоточности производится средством, Async Delegate. Для каждого потока должно быть посчитано время выполнения. Программа должна выводить результат в виде: - имя файла изображения1, ширина изображения1, высота изображения1, время обработки - имя файла изображения2, ширина изображения2, высота изображения2, время обработки …. По результатам параллельной обработки 10 различных изображений построить график зависимости времени работы алгоритма от площади изображения. Programm.cs
Листинг программы
  1. using System;
  2. using ImageProcessingLibrary;
  3. using System.Drawing;
  4. using System.Drawing.Imaging;
  5. using System.Diagnostics;
  6. using ImageProcessingTest;
  7. namespace ImageProcessingTest
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. Console.Clear();
  14. Stopwatch sw = new Stopwatch();
  15. Bitmap src = new Bitmap("example.jpg");
  16. IImageHandler handler = new Gistogramma();
  17. handler.Source = src;
  18. Console.WriteLine(handler.HandlerName);
  19. handler.Source = src;
  20. sw.Reset();
  21. sw.Start();
  22. handler.startHandle(new ProgressDelegate(showProgress));
  23. sw.Stop();
  24. long time1 = sw.ElapsedMilliseconds;
  25. handler.Result.Save("out1.jpg", ImageFormat.Jpeg);
  26. Console.WriteLine("\nPress any key");
  27. Console.ReadLine();
  28. Console.Clear();
  29. sw.Reset();
  30. sw.Start();
  31. }
  32. static void showProgress(double progress)
  33. {
  34. Console.SetCursorPosition(0, 1);
  35. Console.Write("{0,4:F}%", progress);
  36. }
  37. }
  38. }
IImageHendler.cs
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Drawing;
  6. namespace ImageProcessingLibrary
  7. {
  8. //Указатель на функцию обработки прогресса выполнения задачи
  9. public delegate void ProgressDelegate(double precent);
  10. public interface IImageHandler
  11. {
  12. //получение осмысленного имени обработчика
  13. string HandlerName { get; }
  14. //Инициализация параметров обработчика
  15. void init(SortedList<string, object> parameters);
  16. //Установка изображения-источника
  17. Bitmap Source { set; }
  18. //Получение изображения-результата
  19. Bitmap Result { get; }
  20. //Запуск обработки
  21. void startHandle(ProgressDelegate progress);
  22.  
  23. }
  24. }
Gistogramma.cs
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Drawing;
  6. using System.Drawing.Imaging;
  7. using ImageProcessingLibrary;
  8. namespace ImageProcessingLibrary
  9. {
  10. public class Gistogramma : IImageHandler
  11. {
  12. private const string HANDLER_NAME = "Postroenie gistogramm";
  13. private Bitmap bitmap;
  14.  
  15. public string HandlerName
  16. {
  17. get { return HANDLER_NAME; }
  18. }
  19.  
  20. public void init(SortedList<string, object> parameters)
  21. {
  22. }
  23.  
  24. public Bitmap Source
  25. {
  26. set { bitmap = value; }
  27. }
  28.  
  29. public Bitmap Result
  30. {
  31. get { return bitmap; }
  32. }
  33. //Запуск обработки
  34. public void startHandle(ProgressDelegate progress)
  35. {
  36. var R = new byte[256]; // Red
  37. var G = new byte[256]; // Green
  38. var B = new byte[256]; // Blue
  39. for (int i = 0; i < bitmap.Width; i++)
  40. {
  41. progress((double)i * 40.0 / bitmap.Width);
  42. for (int j = 0; j < bitmap.Height; j++)
  43. {
  44. Color color = bitmap.GetPixel(i, j);
  45. ++R[color.R]; // Подсчитываем кол-во оттенков красного
  46. ++G[color.G]; // Подсчитываем кол-во оттенков зеленого
  47. ++B[color.B]; // Подсчитываем кол-во оттенков синего
  48. }
  49. }
  50. long max = 0;
  51. for (int i = 0; i < 256; i++) // Всего 256
  52. {
  53. if (R[i] > max)
  54. {
  55. max = R[i];
  56. }
  57. if (G[i] > max)
  58. {
  59. max = G[i];
  60. }
  61. if (B[i] > max)
  62. {
  63. max = B[i];
  64. }
  65. }
  66. Bitmap red = new Bitmap(1024, 768);
  67. for (int i = 0; i < 256; i++)
  68. {
  69. progress((double)i * 20.0 / 256 + 40);
  70. Color temp = Color.FromArgb(255, 0, 0);
  71. for (int j = 0; j < R[i] * 768 / max; j++)//подгон высоты для высоты изображения
  72. {
  73. for (int k = i * 4; k < i * 4 + 4; k++)//ширина столбика
  74. {
  75. red.SetPixel(k, 767 - j, temp);//закраска
  76. }
  77. }
  78. }
  79. Bitmap green = new Bitmap(1024, 768);
  80. for (int i = 0; i < 256; i++)
  81. {
  82. progress((double)i * 20.0 / 256 + 60);
  83. Color temp = Color.FromArgb(0, 255, 0);
  84. for (int j = 0; j < G[i] * 768 / max; j++)
  85. {
  86. for (int k = i * 4; k < i * 4 + 4; k++)
  87. {
  88. green.SetPixel(k, 767 - j, temp);
  89. }
  90. }
  91. }
  92. Bitmap blue = new Bitmap(1024, 768);
  93. for (int i = 0; i < 256; i++)
  94. {
  95. progress((double)i * 20.0 / 256 + 80.08);
  96. Color temp = Color.FromArgb(0, 0, 255);
  97. for (int j = 0; j < B[i] * 768 / max; j++)
  98. {
  99. for (int k = i * 4; k < i * 4 + 4; k++)
  100. {
  101. blue.SetPixel(k, 767 - j, temp);
  102. }
  103. }
  104. }
  105. red.Save("red.bmp", ImageFormat.Bmp);
  106. green.Save("green.bmp", ImageFormat.Bmp);
  107. blue.Save("blue.bmp", ImageFormat.Bmp);
  108. }
  109. }
  110. }

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

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Threading;
  7.  
  8. namespace ConsoleApplication2
  9. {
  10.     class Program
  11.     {
  12.         private delegate void AsyncDelegate(Bitmap bitmap);
  13.  
  14.         private static IEnumerable<string> GetFileName(StreamReader reader)
  15.         {
  16.             while (!reader.EndOfStream)
  17.                 yield return reader.ReadLine();
  18.         }
  19.  
  20.         static void Main(string[] args)
  21.         {
  22.             var pathToDirectoryImages = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "images");
  23.             using (var reader = File.OpenText("listImage.txt"))
  24.                 GetFileName(reader).ToList().ForEach(imageFileName =>
  25.                     {
  26.                         AsyncDelegate asyncDelegate = ImageProcessing;
  27.                         var pathToImageFile = Path.Combine(pathToDirectoryImages, imageFileName);
  28.                         var image = new Bitmap(pathToImageFile);
  29.                         var start = DateTime.Now.Ticks;
  30.                         asyncDelegate.BeginInvoke(image, ar =>
  31.                             {
  32.                                 asyncDelegate.EndInvoke(ar);
  33.                                 var end = DateTime.Now.Ticks;
  34.                                 Console.WriteLine("Время обработки изображения: {0}", new TimeSpan(end - (long)ar.AsyncState));
  35.                             }, start);
  36.                     });
  37.             Console.ReadLine();
  38.         }
  39.  
  40.         private static void ImageProcessing(Bitmap image)
  41.         {
  42.             // обработка твоего изображения
  43.             Console.WriteLine("Обработка твоего изображения");
  44.         }
  45.     }
  46. }

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


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

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

15   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы