2016-07-13 6 views
0

SUR40 PixelSense 호환 컴퓨터에서 Microsoft Surface 2.0 SDK를 사용하고 있습니다. 그것으로부터 이미지를 캡처하고 .bmp으로 저장해야합니다. Surface SDK에는 RawImageVisualizer 예제가 있습니다.이 예제에서는 화면에서 터치하여 그림을 보여 주므로, 그림을 HDD에 쓰도록 프로그램을 수정하려고했습니다. 문제는 터치에서 캡처 한 바이트 배열에서 Image을 빌드하는 동안 ArgumentException: Parameter is invalid을 얻게된다는 것입니다.PixelSense 호환 PC를 터치하여 이미지 캡처 및 .bmp 파일로 저장

event.UpdateRawImage(
       ImageType.Normalized, 
       normalizedImage, 
       0, 0, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaWidth, 
       InteractiveSurface.PrimarySurfaceDevice.WorkingAreaHeight); 

을 그리고 디스크에 .bmp로 바이트를 작성하려고 방법 그건 : 그래서

System.Drawing.Image img; 
using (System.Drawing.Image raw = System.Drawing.Image.FromStream(new MemoryStream(normalizedImage))) 
{ 
    img = raw.Clone() as System.Drawing.Bitmap; 
} 
img.Save("C:/img.bmp", System.Drawing.Imaging.ImageFormat.Bmp); 

내가 할

이 내가 FrameReceivedEventArgs에서 FrameReceived 이벤트에 이미지 데이터를 바이트의 배열을 검색하는 방법입니다 스트림에서 Image을 (를) 만들려고하는 예외입니다. 그럼에도 불구하고이 바이트 배열은 Texture2D 및 표시 할 SpriteBatch으로 완전히 작동합니다. ArgumentException을 어떻게 수정합니까?

답변

0

방금 ​​UpdateRawImage은 파일 PNG의 바이트 표현을 반환하지 않지만 픽셀 배열만을 반환한다는 것을 깨달았습니다. 따라서 이미지를 만들려면 파일 구조의 다른 모든 부분을 헤더와 색상 표 (필요한 경우)로 배열에 작성해야합니다. 대부분의 경우 이것은 단순히 하나의 System.Drawing.Bitmap의 생성자 수행 할 수 있습니다 :

public Bitmap(
    int width, 
    int height, 
    int stride, 
    PixelFormat format, 
    IntPtr scan0 
) 

하지만 난 정말 운이 아니었다, UpdateRawImage 반환 그레이 스케일 픽셀을 8bpp를하기 때문에, 그리고 PixelFormat 열거 형을 지원하지 않습니다 (가장 가까운 Format16bppGrayScale입니다, 하지만 픽셀이 아니라 2 바이트를 사용합니다. 따라서이 특정한 상황에는 두 가지 분명한 해결책이 있습니다. 첫 번째는 PixelFormat 표준 중 하나를 충족하는 새로운 픽셀 배열을 만드는 것입니다. 실제로는 256 색조의 흑백이지만 24 비트 RGB 이미지가 필요하기 때문에 제 선택이었습니다. 두 번째는 수동으로 BMP 헤더를 쓰는 것입니다 (오픈 스펙으로 인해 그다지 어렵지는 않습니다).