문제

48 비트 픽셀 PNG 파일을 독점 (Bayer) 형식으로 변환하는 응용 프로그램을 작성하려고합니다.

코드 (예의 여기) 아래는 일부 PNG 파일 형식에 적합하지만, Bona fide 48 비트 PNG를 시도하면 코드가 예외를 던집니다. 대안이 있습니까?

    static public byte[] BitmapDataFromBitmap(Bitmap objBitmap)
    {
        MemoryStream ms = new MemoryStream();
        objBitmap.Save(ms, ImageFormat.BMP);  // GDI+ exception thrown for > 32 bpp
        return (ms.GetBuffer());
    }

    private void Bayer_Click(object sender, EventArgs e)
    {
        if (this.pictureName != null)
        {
            Bitmap bmp = new Bitmap(this.pictureName);
            byte[] bmp_raw = BitmapDataFromBitmap(bmp);
            int bpp = BitConverter.ToInt32(bmp_raw, 28); // 28 - BMP header defn.

            MessageBox.Show(string.Format("Bits per pixel = {0}", bpp));
        }
    }
도움이 되었습니까?

해결책

BMP 인코더는 48bpp 형식을 지원하지 않습니다. bitmap.lockbits () 메소드로 픽셀에서 균열을 얻을 수 있습니다. PixelforMat의 MSDN 라이브러리 기사에 따르면 48bpp는 24bpp 이미지처럼 취급되었지만 실제로이 코드를 사용하여 6 바이트 픽셀을 볼 수 있습니다.

  Bitmap bmp = new Bitmap(@"c:\temp\48bpp.png");
  BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadOnly, PixelFormat.Format48bppRgb);
  // Party with bd.Scan0
  //...
  bmp.UnlockBits(bd);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top