#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, и спасибо вам за ответ. Не могли бы вы, пожалуйста, отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые новички в языке и изо всех сил пытаются понять концепции.