Вызов b.GetPixel
в этом методе довольно медленный, есть ли способ ускорить этот метод с помощью LockBits или что-то в этом роде?Но я не знаю, как работать с указателями, чтобы получить значение пикселя и т. Д.
Справочная информация: мне нужен float[][]
из-за взвешенной рандомизации, которую я задал в этом вопросе.
public static float[][] ConvertToGrayScale(this Bitmap bm)
{
var b = new Bitmap(bm);
var data = new List<float[]>();
for (var i = 0; i < b.Width; i++)
{
var row = new List<float>();
for (int x = 0; x < b.Height; x++)
{
var oc = b.GetPixel(i, x);
var grayScale = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
row.Add(grayScale);
}
data.Add(row.ToArray());
}
return data.ToArray();
}
РЕДАКТИРОВАТЬ
Как упомянуто ниже от Пола Сасика, я изменил код на этот:
public static GrayScaleResult ConvertToGrayScale(this Bitmap bm)
{
var result = new GrayScaleResult(bm);
for (var x = 0; x < result.Width; x++)
{
for (int y = 0; y < result.Height; y++)
{
var oc = bm.GetPixel(x, y);
// casting to int here - you can just use a 2d array of ints
result.Data[x, y] = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
}
}
return result;
}
public struct GrayScaleResult
{
public float[,] Data;
public int Width;
public int Height;
public GrayScaleResult(Bitmap bm)
{
Width = bm.Width;
Height = bm.Height;
Data = new float[Width, Height];
}
}
И я проверил производительность с помощью профилировщикадо и после этой оптимизации:
![enter image description here](https://i.stack.imgur.com/BEdp6.png)
Интересно, что getHeight
занимает много времени, поэтому кажется, что он не кэшируется в растровом объекте?Из-за этого я также сохранил ширину и высоту в структуре.
Но результат не может быть, не так ли?Я имею в виду, что узкое место все еще GetPixel
, но почему это занимает больше времени сейчас?Я ничего не изменил, базовое растровое изображение остается прежним.
EDIT2
Хорошо, нашел это: Проблема была на удивление удалением new Bitmap
поэтому я добавил это снова:
public static GrayScaleResult ConvertToGrayScale(this Bitmap b)
{
var bm = new Bitmap(b);
var result = new GrayScaleResult(bm);
...
А теперь код оптимизирован :
![enter image description here](https://i.stack.imgur.com/Ja3Go.png)