none
DIB位图坐标系的疑问 RRS feed

答案

  • DIB设备无关位图文件,这是一种文件格式. DIB的与设备无关性主要体现在以下两个方面:DIB的颜色模式与设备无关。

    hDC是DC的句柄,API中的一个类似指针的数据类型


    Please mark this reply as answer if it helps you! Thanks for your cooperation! Good Luck to you.

    • 已建议为答案 Helen Zhao 2012年6月14日 2:09
    • 已标记为答案 luke chen 2012年6月14日 3:59
    2012年6月7日 3:10

全部回复

  • DIB设备无关位图文件,这是一种文件格式. DIB的与设备无关性主要体现在以下两个方面:DIB的颜色模式与设备无关。

    hDC是DC的句柄,API中的一个类似指针的数据类型


    Please mark this reply as answer if it helps you! Thanks for your cooperation! Good Luck to you.

    • 已建议为答案 Helen Zhao 2012年6月14日 2:09
    • 已标记为答案 luke chen 2012年6月14日 3:59
    2012年6月7日 3:10
  • 非常感谢您的回复!

    因为《Windows程序设计》一书中,对GDI坐标系和DIB的坐标系进行过阐述,可是程序的不正确结果让我对概念产生了混淆。经过试验,已经证实上述坐标转换是正确的(在dib设置的biHeight为正数的情况下),我的问题在于对于dib中像素点的颜色赋值出错!

    因为采用dib的方案,是为了替代SetPixel函数,SetPixel中对于颜色值是直接赋值一个COLORREF类型值的(比如clWhite),对于dib的像素点我也采用了这样的做法,结果导致了错误的颜色值。

    对于我的上述情况,正确的赋值方式如下:

            unsigned long **FBuf; // 1000 * 1000, 存储color值得既定数组。

            // ......

            int width = 1000;
            int height = 1000;

            BITMAPINFO lpbmi;
            lpbmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
            lpbmi.bmiHeader.biWidth = width;
            lpbmi.bmiHeader.biHeight = height;
            lpbmi.bmiHeader.biPlanes = 1;
            lpbmi.bmiHeader.biBitCount = 32;
            lpbmi.bmiHeader.biCompression = BI_RGB;

            BYTE* pBits = NULL;    // 注意此处为BYTE,下面计算的时候应该乘以(biBitCount  / 8) = 4;
            HBITMAP hBtmp= ::CreateDIBSection(NULL, &lpbmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);
            HBITMAP hOldBmp = ::SelectObject(hdc, hBtmp);

            for (x = 0; x < 1000; x++) {
    lp = FBuf[x];
    for (y = 0; y < 1000; y++, lp++) {

                                         // 【1】原先的方式

                                         // int y0 = FB_Y - y - 1;
                                          // SetPixelV(hdc, x, y0, (*lp));

         // 【2】错误方式

         // pBits[(y * width * 4) + x * 4 ] = *lp;

        // 【3】最终正确的方案

                                          pBits[(y * width * 4) + x * 4 + 2] = GetRValue( (*lp) );  // r
                                          pBits[(y * width * 4) + x * 4 + 1] = GetGValue( (*lp) );  // g
                                          pBits[(y * width * 4) + x * 4 + 0] = GetBValue( (*lp) );  // b
    }

           }


    Luke Chen No music, no way coolchae@gmail.com

    2012年6月8日 1:38
  • DIB设备无关位图文件,这是一种文件格式. DIB的与设备无关性主要体现在以下两个方面:DIB的颜色模式与设备无关。

    hDC是DC的句柄,API中的一个类似指针的数据类型


    Please mark this reply as answer if it helps you! Thanks for your cooperation! Good Luck to you.

    是不是因为他的设备无关性,所以他的颜色设置也和GDI不同?什么情况下是直接赋值一个COLORREF值呢?像SetPixel(xx, xx, clWhite);

    谢谢!O(∩_∩)O~


    Luke Chen No music, no way coolchae@gmail.com

    2012年6月8日 1:40