2012-11-22 138 views
3

我有一個二維double[,] rawImage數組表示一個灰度圖像,數組中的每個元素都有一個從0〜1的有理數值,我需要 將它轉換爲Bitmap圖像,我用下面的代碼:從雙二維陣列創建位圖

private Bitmap ToBitmap(double[,] rawImage) 
{ 
    int width = rawImage.GetLength(1); 
    int height = rawImage.GetLength(0); 

    Bitmap Image= new Bitmap(width, height); 

    for (int i = 0; i < height; i++) 
     for (int j = 0; j < YSize; j++) 
       { 
       double color = rawImage[j, i]; 
       int rgb = color * 255; 
       Image.SetPixel(i, j, rgb , rgb , rgb); 
       } 

    return Image; 
} 

但它似乎太慢了。 我不知道是否有方法使用short數據類型的指針來完成上述工作。

如何使用指針來編寫更快的代碼來處理此函數?

+0

['bitMap.LockBits'](http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx) –

+0

SetPixel鎖定爲每個像素的整個圖像。如果您鎖定整個圖像,則可以使用不安全的代碼寫入圖像中的每個值。 http://stackoverflow.com/questions/7768711/setpixel-is-too-slow-is-there-a-faster-way-to-draw-to-bitmap – MrFox

回答

5

這應該足夠了你。這個例子是根據這個source code寫的。

private unsafe Bitmap ToBitmap(double[,] rawImage) 
{ 
    int width = rawImage.GetLength(1); 
    int height = rawImage.GetLength(0); 

    Bitmap Image = new Bitmap(width, height); 
    BitmapData bitmapData = Image.LockBits(
     new Rectangle(0, 0, width, height), 
     ImageLockMode.ReadWrite, 
     PixelFormat.Format32bppArgb 
    ); 
    ColorARGB* startingPosition = (ColorARGB*) bitmapData.Scan0; 


    for (int i = 0; i < height; i++) 
     for (int j = 0; j < width; j++) 
     { 
      double color = rawImage[i, j]; 
      byte rgb = (byte)(color * 255); 

      ColorARGB* position = startingPosition + j + i * width; 
      position->A = 255; 
      position->R = rgb; 
      position->G = rgb; 
      position->B = rgb; 
     } 

    Image.UnlockBits(bitmapData); 
    return Image; 
} 

public struct ColorARGB 
{ 
    public byte B; 
    public byte G; 
    public byte R; 
    public byte A; 

    public ColorARGB(Color color) 
    { 
     A = color.A; 
     R = color.R; 
     G = color.G; 
     B = color.B; 
    } 

    public ColorARGB(byte a, byte r, byte g, byte b) 
    { 
     A = a; 
     R = r; 
     G = g; 
     B = b; 
    } 

    public Color ToColor() 
    { 
     return Color.FromArgb(A, R, G, B); 
    } 
} 
+0

我測試這段代碼,我會接受它只要它工作正常。 –

+0

你應該在行「double color = rawImage [j,i];」中交換indecies「i,j」,因爲在這種形式中導致「index超出範圍異常」 –

+0

@SamehKamal對不起,這是因爲複製粘貼。我會改變的。代碼有用嗎? –