2014-06-17 1 views
0

우리는 실제로 RAW 형식의 비트 맵 이미지를 가지고 있지만 Windows 비트 맵 형식을 사용합니다. 그러나 카메라를 제공하지 않으면 lib를 디코딩하여 좋은 결과를 얻을 수 없습니다. 여기이 비트 맵 조작 루틴에 해당하는 WIC 버전은 무엇입니까?

DecodeImageRaw
public static Bitmap DecodeImage(Bitmap raw_image) 
    { 
     if (raw_image == null || raw_image.PixelFormat != PixelFormat.Format8bppIndexed) 
      return null; 

     BitmapData data_in, data_out; 
     Bitmap rgb_image = new Bitmap(raw_image.Width, raw_image.Height, PixelFormat.Format24bppRgb); 
     data_in = raw_image.LockBits(new Rectangle(0, 0, raw_image.Width, raw_image.Height), ImageLockMode.ReadWrite, raw_image.PixelFormat); 
     data_out = rgb_image.LockBits(new Rectangle(0, 0, rgb_image.Width, rgb_image.Height), ImageLockMode.ReadWrite, rgb_image.PixelFormat); 
     try 
     { 
      DecodeImageRaw(raw_image.Width, raw_image.Height, data_in.Scan0, data_out.Scan0); 
      return rgb_image; 
     } 
     finally 
     { 
      raw_image.UnlockBits(data_in); 
      rgb_image.UnlockBits(data_out); 
     } 
    } 

이미지를 디코딩하기 위해 카메라 LIB를 사용하는 방법이다 :

다음

잘 작동 코드이다. 위는 우리에게 잘 작동합니다.

창문 이미징 요소를 사용하여 동일한 코드의 새로운 버젼 :

public static BitmapSource DecodeImage(BitmapSource raw_image) 
    { 
     if (raw_image == null || raw_image.Format != PixelFormats.Indexed8) 
      return null; 

     var w = raw_image.PixelWidth; 
     var h = raw_image.PixelHeight; 
     var dx = raw_image.DpiX; 
     var dy = raw_image.DpiY; 
     var in_image = new WriteableBitmap(w, h, dx, dy, PixelFormats.Indexed8, raw_image.Palette); 
     var out_image = new WriteableBitmap(w, h, dx, dy, PixelFormats.Rgb24, null); 

     in_image.Lock(); 
     out_image.Lock(); 

     var bufin = in_image.BackBuffer; 
     var bufout = out_image.BackBuffer; 
     var s = in_image.BackBufferStride; 
     try 
     { 
      raw_image.CopyPixels(Int32Rect.Empty, bufin, h*s, s); 

      out_image.AddDirtyRect(new Int32Rect(0, 0, w, h)); 
      DecodeImageRaw(w, h, bufin, bufout); 
      return out_image; 
     } 
     finally 
     { 
      in_image.Unlock(); 
      out_image.Unlock(); 
     } 
    } 

위 실제로 동일한 형상의 화상을 출력하지만 색이 잘못 (예를 들어, 배경은 "블루되어야 "하늘에, 그러나 그것은 갈색이된다.

그래서? 또한 나는 이유의 설명을 알고 싶은 원래 하나가 동등한 만드는 방법 새 코드?에 문제가 있습니다.

Good image

디코딩 된 이미지는이

Bad image

과 같아야하지만이

편집과 같은 새로운 코드로 디코딩 된

첫 번째 편집 이후 일부 약간의 조정이있다 관련없는 내용을 쉽게 읽고 배제 할 수 있도록 코드에 추가하십시오. 예를 들어, 알고리즘간에 선택할 플래그는 bool 이었지만 지금 제거되었습니다. 그러나 동작은 동일하게 유지됩니다.

답변

2

채널이 뒤로 있습니다 : RGBBGR입니다.

나는 그 효과를 인정했다. 그것을 확인하려면 포토샵에서 디코딩 된 이미지를 열고 빨간색 및 채널을 수동으로 바꿨습니다. 나는 다음 이미지를 가지고 당신이 예상하는 (뭐든 지옥의) :

enter image description here

을 내가 코드를 이해하지만 PixelFormats.Rgb24PixelFormats.Bgr24보다는 을 시도하지 않습니다.

+1

픽셀 형식의 WIC 명명 규칙은 GDI + 명명 규칙의 반대 인 파일에 나타나는 방식으로 구성 요소를 정렬하는 것입니다. –

+1

고마워요! 이것은 내 문제를 해결하는 것 같다. –