Получите общее значение изображения

#c# #image-processing

Вопрос:

Ниже приведен мой код:

 private double GetImageValue(Bitmap Image) {  double ImageValue = 0;   for (int X = 0; X lt; Image.Width; X  )  {  for (int Y = 0; Y lt; Image.Height; Y  )  {  Color CurrentPixel = Image.GetPixel(X, Y);   ImageValue  = CurrentPixel.A   CurrentPixel.B   CurrentPixel.G   CurrentPixel.R;  }  }  return ImageValue; }  

Код возвращает общее значение каждого пикселя на изображении. Есть ли способ ускорить процедуру?

Комментарии:

1. распараллеливание цикла double for

2. Попробуйте использовать LockBits и считывать весь массив за один раз

3. @Charlieface, пожалуйста, предоставьте код для использования блокировок вместо того, что код делает в настоящее время.

4. многопоточность (OpenMP?) Разрезает домен на широкие горизонтальные полосы, распределяя их по ядрам. — убедитесь, что компилятор создает векторные инструкции SSE/AVX/…

5. @ChristophRackwitz, пожалуйста, предоставьте код для многопоточности. Спасибо.

Ответ №1:

Что-то вроде этого:

 private double GetImageValue(Bitmap image) { double imageValue = 0;  var rect = new Rectangle(0, 0, image.Width, image.Height); var bmpData = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var ptr = bmpData.Scan0; var bytes = Math.Abs(bmpData.Stride) * image.Height; var values = new byte[bytes];  System.Runtime.InteropServices.Marshal.Copy(ptr, values, 0, bytes);  for (int y = 0; y lt; image.Height; y  ) {  int lineStart = y * Math.Abs(bmpData.Stride);  for (int x = 0; x lt; image.Width * 3; x  )  {  imageValue  = values[lineStart   x];  } } image.UnlockBits(bmpData); return imageValue; }  

Комментарии:

1. Добро пожаловать в Stack Overflow, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.