3

次のような 24 ビット ビットマップをセットアップして作成すると、次のようになります。

   //fileheader
    BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
    bf->bfType = 0x4d42;
    bf->bfSize = 6054400 + 54;
    bf->bfOffBits = 54;

    //infoheader
    BITMAPINFOHEADER* bi = new BITMAPINFOHEADER;
    bi->biSize = 40;
    bi->biWidth = 2752;
    bi->biHeight = -733;
    bi->biPlanes = 1;
    bi->biBitCount = 24;
    bi->biCompression = 0;
    //bi->biSizeImage = 6054400;
    bi->biXPelsPerMeter = 2835;
    bi->biYPelsPerMeter = 2835;
    bi->biClrUsed = 0;
    bi->biClrImportant = 0;

    pFrame->GetImage(m_imageData);

    //
    //create bitmap...
    //(hbit is a global variable)

    BITMAPINFO* bmi;
    bmi = (BITMAPINFO*)bi; 
    HDC hdc = ::GetDC(NULL);

    hbit = CreateDIBitmap(hdc, bi, CBM_INIT, m_imageData, bmi, DIB_RGB_COLORS);

次のような出力画像が得られます。 画像1

しかし、ビット数を 24 から 8 に変更すると (3 倍の画像サイズも可能になり、733 幅から 2200 の画像の自然な幅に移動できるようになります)、次のような画像が得られます (多くの不安定性と共に):

画像2

私の出力は次のようになります。

    BITMAP* bi = new BITMAP;
    CBitmap bmp;
    bmp.Attach(hbit);
    CClientDC dc(pWnd);
    CDC bmDC;
    bmDC.CreateCompatibleDC(&dc);
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp);
    bmp.GetBitmap(bi);
    dc.BitBlt(384,26,bi->bmWidth/3,bi->bmHeight,&bmDC,0,0,SRCCOPY);
    //note: if bitcount is 8, height and width need to be /3, 
          //if 24, only width gets /3 
    bmDC.SelectObject(pOldbmp);

    //explicitly delete everything just to be safe
    delete bi;
    DeleteObject(bmp);
    DeleteObject(dc);
    DeleteObject(pOldbmp);
    DeleteObject(bmDC);

だから私の質問は:

  • 24 から 8 に切り替えたときにこの問題が発生するのはなぜですか?
  • 画像をカラーではなくモノクロで出力する簡単な方法はありますか?

最後に一つだけ:

私の同僚は、同様の問題のためにずっと前にこの関数を書きましたが、彼は私がそれを使用できるかもしれないと言いました。残念ながら、私はそれを機能させることができません:

void CopyMono8ToBgrx(byte* pDestBlue, byte* pDestGreen, byte *pDestRed, byte* pDestAlpha)
    {
        byte*               pSrc;
        byte*               pSrcEnd;

        pSrc = ( byte* ) m_imageData;
        pSrcEnd = pSrc + ( 2752*2200 );

        while ( pSrc < pSrcEnd )
        {
            byte data = *pSrc;

            *pDestBlue  = data;
            *pDestGreen = data;
            *pDestRed   = data;
            *pDestAlpha = 255;  // alpha is always 255 (fully opaque)

            pSrc++;
            pDestBlue   += 4;
            pDestGreen  += 4;
            pDestRed    += 4;
            pDestAlpha  += 4;
        }
    }
4

2 に答える 2

2

ピクセルあたり 8 ビットのイメージは、次のBITMAPINFOHEADER構造のカラー パレットを想定しています (「 」を参照BITMAPINFO::bmiColors)。パレットを 256 グレー シェードにすると、画像は 8 bpp グレースケールになります。これで、ランダムな色の色になりました。

引用した関数CopyMono8ToBgrxは、灰色の個々のピクセル(R = G = B)でフルカラーのビットマップを作成します。

于 2013-02-14T14:24:39.587 に答える