C# 加速转换法
这个方法中的C# 加速转换法,c#,image-processing,C#,Image Processing,这个方法中的b.GetPixel调用非常慢,有没有办法用锁位之类的东西来加速这个方法?但我不知道如何使用指针来获得像素值等 背景:我需要float[][],因为我提出了加权随机化的问题 public static float[][] ConvertToGrayScale(this Bitmap bm) { var b = new Bitmap(bm); var data = new List<float[]>(); for (var i = 0; i <
b.GetPixel
调用非常慢,有没有办法用锁位之类的东西来加速这个方法?但我不知道如何使用指针来获得像素值等
背景:我需要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 float[,] ConvertToGrayScale2(this Bitmap bm)
{
var data = new float[bm.Width, bm.Height];
for (var i = 0; i < bm.Width; i++)
{
for (int x = 0; x < bm.Height; x++)
{
var oc = bm.GetPixel(i, x);
// casting to int here - you can just use a 2d array of ints
data[i, x] = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
}
}
return data;
}
publicstaticfloat[,]ConvertToGrayScale2(此位图bm)
{
var数据=新浮动[bm.宽度,bm.高度];
对于(变量i=0;i
优化:
- 无需创建新位图即可使用。引用你传递的那个
- 使用浮点数的矩形数组,而不是常规列表
- 这将消除许多额外的分配和一些集合创建/管理开销
- 请带上一点盐,不要用IDE
public static GrayScaleResult ConvertToGrayScale(this Bitmap b)
{
var bm = new Bitmap(b);
var result = new GrayScaleResult(bm);
...
public static float[,] ConvertToGrayScale2(this Bitmap bm)
{
var data = new float[bm.Width, bm.Height];
for (var i = 0; i < bm.Width; i++)
{
for (int x = 0; x < bm.Height; x++)
{
var oc = bm.GetPixel(i, x);
// casting to int here - you can just use a 2d array of ints
data[i, x] = (int)((oc.R * 0.3) + (oc.G * 0.59) + (oc.B * 0.11));
}
}
return data;
}