2012-11-22 4 views
3

배열의 각 요소가있는 회색 레벨 이미지를 나타내는 2 차원의 double[,] rawImage 배열은 0 ~ 1의 유리한 값을 가지고 있으며, 이미지로 변환하려면 이미지가 필요합니다. 나는 다음과 같은 코드를 사용했습니다 :두 개의 두 차원 배열에서 비트 맵 만들기

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"를 교환해야합니다.이 형식의 "범위를 벗어난 인덱스 예외" –

+0

@SamehKamal 예 죄송합니다. 복사 붙여 넣기 때문입니다. 내가 바꿀거야. 코드가 도움이됩니까? –

관련 문제