2014-09-26 148 views
2

第一次使用C#在这里工作。我正在读几个图像文件,做一些计算,并输出和双数组。我需要能够保存这个双数组(或这些,因为我将有多个数组),以灰度图像。我在互联网上四处寻找,我找不到太多东西。我已经在Python和Mathlab上完成了它,但是C#似乎并不像我那么友好。这是我迄今为止所做的(用于双重图像创作)。C#将2D双精度数组转换为灰度图像

 static Image MakeImage(double[,] data) 
    { 
     Image img = new Bitmap(data.GetUpperBound(1), data.GetUpperBound(0)); 
     //Bitmap bitmap = new Bitmap(data.GetUpperBound(1), data.GetUpperBound(0)); 
     for (int i = 0; i < data.GetUpperBound(1); i++) 
     { 
      for (int k = 0; k < data.GetUpperBound(0); k++) 
      { 
       //bitmap.SetPixel(k, i, Color.FromArgb((int)data[i, k],(int) data[i, k],(int) data[i, k])); 
      } 
     } 

     return img; 
    } 
} 

}

这段代码实际上没有做多少。它创建我的空白图像模板。颜色不需要双重作为输入。我不知道如何从数据创建图像...我卡住=)

谢谢你提前。

+0

[转换图像灰度(可能重复http://stackoverflow.com/questions/2265910/convert-an-图像到灰度) – 2014-09-26 20:37:48

+0

您的代码没问题,数据的内容是什么? – brz 2014-09-26 20:58:13

+0

嗨,代码目前只创建一个新的位图图像。我的问题是,我希望能够获取某个DOUBLE [,]数据并将其制作为图像。例如:[[1.1,2.5],[4.2,3.3]] - >里面有这些数据的图片(位图图像​​)。 (现在,它创建一个空白图像,并且注释部分创建一个INTEGER图像)。 – IHaveSumQuestions 2014-09-27 20:50:28

回答

2

如果你能接受使用不安全块,这是相当快的:

private Image CreateImage(double[,] data) 
    { 
     double min = data.Min(); 
     double max = data.Max(); 
     double range = max - min; 
     byte v; 

     Bitmap bm = new Bitmap(data.GetLength(0), data.GetLength(1)); 
     BitmapData bd = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); 

     // This is much faster than calling Bitmap.SetPixel() for each pixel. 
     unsafe 
     { 
      byte* ptr = (byte*)bd.Scan0; 
      for (int j = 0; j < bd.Height; j++) 
      { 
       for (int i = 0; i < bd.Width; i++) 
       { 
        v = (byte)(255 * (data[i, bd.Height - 1 - j] - min)/range); 
        ptr[0] = v; 
        ptr[1] = v; 
        ptr[2] = v; 
        ptr[3] = (byte)255; 
        ptr += 4; 
       } 
       ptr += (bd.Stride - (bd.Width * 4)); 
      } 
     } 

     bm.UnlockBits(bd); 
     return bm; 

    }