2009-07-28 6 views
0

바이트 배열의 코드에서 System.Drawing.Bitmap을 만들고 있는데 .BMP 파일로 제대로 저장되도록 설정해야하는 속성과 설정이 확실하지 않습니다. I는 비트 맵 데이터를 설정하는 코드 (그것은 16 개 비트 little'endian 값을 포함하는 바이트 어레이로부터 판독하고 픽셀을 그레이 스케일로 변환 한 것)로 코드에서 비트 맵 만들기; 어떤 단계가 필요합니까?

for (int i = 1; i < data.Length; i += 2;) 
    { 
     Color c = new Color(); 
     c.A = data[i]; 
     c.R = data[i]; 
     c.G = data[i]; 
     c.B = data[i]; 
     int x = (i + 1)/2; 
     int y = x/width; 
     x %= width; 
     b.SetPixel(x, y, c); 
    } 

내 생성자로서 Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb);

있다. 이 비트 맵을 저장 가능하게 만들려면 어떻게해야합니까?

답변

1

다른 작업을 수행 할 필요가없는 이미지 데이터를 설정 한 후 비트 맵을 저장할 수 있습니다.

는 또한 Bitmap 클래스의 see this link for more information.

+0

저는 현재 속도보다는 작동 코드를 사용할 것입니다. 그래도 최고의 답변 인 것처럼 보입니다. 감사합니다! – RCIX

0

(i=1에서 시작은 BTW, 나쁜 움직임처럼 보인다 - 0해야 하는가?) 당신이 (b.Save("foo.bmp");)을 저장하려고하면

은 무엇됩니까?

또한; 이것이 큰 이미지라면 LockBits을 보길 원할 것입니다. 관련 게시물은 here입니다 (단, 1 차원 배열이 아닌 직사각형 배열을 사용함).

+0

자세한 내용은 Wikipedia article on Grayscale를 참조하십시오 내가하지 않은 2 추가 꽤 테스트 할 수있는 지점에 이르렀지만 나는 그것에 대해 연구 중입니다. – RCIX

1

인스턴스는 단지 Save(string filename) 메소드를 호출하여 .BMP 파일로 저장할 수 있습니다, 루프에 사용 된 SetPixel 방법은 완전히 느린 있습니다.

다른 답변에서 언급했듯이 루프에서 한 번에 하나씩 픽셀을 설정하는 것은 약간 느립니다.

또한, 당신이 Color 구조체의 속성을 설정할 수 없습니다, 당신은 다음과 같이 만들어야합니다 :

Color c = Color.FromArgb(data[i], data[i + 1], data[i + 2], data[i + 3]); 

(확실하지 데이터에 포함되는 것 [] 배열)

+0

나는 데이터를 int 값으로 변환하는 다른 방법을 고안했다. – RCIX

0

회색 음영 계산 공식은 일반적으로 사용되지 않습니다. 허락하신다면, 꽤 잘 돌아갈 것이지만, 아마도 당신은 표준을 지키길 원할 것입니다. 눈은 일부 색상 (녹색)을 잘 받아들이므로 다른 칭량을 사용합니다. 나는 이렇게 색을 설정할 것입니다;

c.R = 0.3 * data[i]; 
c.G = 0.59 * data[i]; 
c.B = 0.11 * data[i]; 
c.A = 1; 

내가 1에서 시작하는 이유는 그래서, 나는 색상으로 변환 각 16 비트 값의 상위 바이트를 던질 것을 권고했다

관련 문제