这个问题我前两天发过一个贴:http://topic.csdn.net/u/20100812/13/c6c9a6bd-8636-441d-9c53-ddc4b35f9388.htmlSyntax FETCh:DPSA:TRACe:BITMap?
Arguments None
Returns (With Option 200) A binary block of 32-bit floating point values (IEEE standard
single precision floating point format). Each value ranges from 0 to 1.0, where 1.0
represents 100%. Option 200 bitmaps have 201 rows and 801 columns. Data[0]
is the first column in the first row, data[801] is the first column in the 2nd row,
and so on.
(Without Option 200) A binary block of unsigned 16-bit Little Endian
integers. Each value ranges from 0 to 2^16-1, where 2^16-1 represents 100%.
Non-option-200 bitmaps have 201 rows and 501 columns. Data[0] is the first
column in the first row, data[501] is the first column in the 2nd row, and so on.
Examples FETCH:DPSA:TRACE:BITMAP? might return #6644004xxxx... (Option 200)
or #161,001xxxx... (non-Option 200).
现在想问问具体该如何编码实现?这两天我看了《Windows程序设计》中的位图、DIB和调色板管理器。最后一部分看的有点半知半解。请问显示上面的数据需要调色板吗,还是直接在BITMAPINFO中直接指定RGBQUAD结构?

解决方案 »

  1.   

    看这说明,好象是灰度图象?不过0 ~ 2^16-1范围大了点,屏幕图象只有256级灰度数据只是灰度值,16位,32位,8位都是无所谓的,按百分比换算到0~255之间的值,SetPixe或者填充图象数据数组后加上BITMAPINFO都可以。
      

  2.   

    原图是一个彩色图。颜色是按照该点统计出现的次数来设置。当某频率从未出现(或者某个阈值)时表示黑色,当点出现的次数非常多(一个阈值)时表现为红色,中间色还有蓝色、绿色、黄色等。下面的图是设备上的原始图像,我获取的数据是通过它的指令来读取到的,我需要把这幅图像根据读取到的数据从新还原。不知上面有没有显示出图片,如果没有的话下面是图片的链接地址:http://hiphotos.baidu.com/clxye/pic/item/0a6d0209898524ec2fddd41e.jpg谢谢各位!!
      

  3.   

    这个地址应该能看到图:
    http://hi.baidu.com/clxye/album/item/0a6d0209898524ec2fddd41e.html#IMG=0a6d0209898524ec2fddd41e
      

  4.   

    不是头像的那个图像,我想换的,但今天CSDN换不了头像(好像在维护中),头像是我当时做三维频谱时用的。图象链接是这个:
    http://hi.baidu.com/clxye/album/item/0a6d0209898524ec2fddd41e.html#IMG=0a6d0209898524ec2fddd41e
      

  5.   

    http://hi.baidu.com/clxye/album/%C4%AC%C8%CF%CF%E0%B2%E1#/clxye/album/%C4%AC%C8%CF%CF%E0%B2%E1/index/2我看到这个图了,是这个页面右下的那个频谱图。
    根据图,感觉原始图像格式是以频率特征编码的,需要转化成位图格式。但是转换的公式,楼主好像没有提供。
      

  6.   

    谢谢楼上的各位!我上传到CSDN上我的相册中了,如果看不到可以到我CSDN空间相册中查看:
    http://hi.csdn.net/attachment/201008/16/36689_1281939756N533.jpg这个公式应该还好,文档中说明:Each value ranges from 0 to 2^16-1, where 2^16-1 represents 100%。也就是说实际的值是0 - 2^16-1,所表示的意义就是0-100。可以简单理解成一次没出现就是0,出现25次就是25,大于等于100就是100来算。
    0 - 2^16 - 1
    对应意义
    0 - 100下面是它文档中规定的颜色对应颜色
    黑色 - 蓝色 - 浅蓝色 - 青色 - 竹绿色 - 绿色 - 黄色 - 橙色 - 桔红色 - 红色
    0      1      2      3     4      5     6     7      8      9也就是对应着十个等级,等分就可以了。现在的问题是该如何创建DIB信息和颜色表并显示出来?
      

  7.   

    这么看来,你创建的DIB就不一定是16位的,为了方便快速,你可以创建32位的DIB。
    你只要了解一下位图格式就行了。
      

  8.   


    //传入参数:
    // hWnd: 显示图像用的窗口
    // pwData:从设备读出的数据(应为501 * 201个WORD型数据)
    // nWidth:图像宽度,应为501
    // nHeight:图像高度,应为201
    void Display(HWND hWnd, const WORD *pwData, int nWidth, int nHeight)
    {
       BITMAPINFO *pBMInfo = (BITMAPINFO *)(new BYTE [sizeof(BITMAPINFOHEADER) + 16 * sizeof(RGBQUARD)];
       BITMAPINFOHEADER *pbmh = &(pBMInfo->bmiHeader);
       RGBQUARD *pPal = &(pBMInfo->bmiColors);   ZeroMemory(pbmh, sizeof(BITMAPINFOHEADER));
       pbmh->biSize = sizeof(BITMAPINFOHEADER);
       pbmh->biWidth = nWidth;
       pbmh->biHeight = nHeight;
       pbmh->biPlanes = 1;
       pbmh->biBitCount = 4;   ZeroMemory(pbmh, sizeof(RGBQUARD) * 16);
       pPal[0].rgbBlue = 0;
       pPal[0].rgbGreen = 0;
       pPal[0].rgbRed = 0;
       pPal[1].rgbBlue = 255;
       pPal[1].rgbGreen = 0;
       pPal[1].rgbRed = 0;
       pPal[2].rgbBlue = 255;
       pPal[2].rgbGreen = 127;
       pPal[2].rgbRed = 0;
       pPal[3].rgbBlue = 255;
       pPal[3].rgbGreen = 255;
       pPal[3].rgbRed = 0;
       pPal[4].rgbBlue = 127;
       pPal[4].rgbGreen = 255;
       pPal[4].rgbRed = 0;
       pPal[5].rgbBlue = 0;
       pPal[5].rgbGreen = 255;
       pPal[5].rgbRed = 0;
       pPal[6].rgbBlue = 0;
       pPal[6].rgbGreen = 255;
       pPal[6].rgbRed = 255;
       pPal[7].rgbBlue = 0;
       pPal[7].rgbGreen = 127;
       pPal[7].rgbRed = 255;
       pPal[8].rgbBlue = 0;
       pPal[8].rgbGreen = 63;
       pPal[8].rgbRed = 255;
       pPal[9].rgbBlue = 0;
       pPal[9].rgbGreen = 0;
       pPal[9].rgbRed = 255;   DWORD dwLineBytes = ((pbmh->biWidth * pbmh->biBitCount + 31) / 32) * 4;
       BYTE *pucBits = new BYTE [dwLineBytes * pbmh->biHeight];
       BYTE *pucLine, *pucPixel;   pucLine = pucBits;
       BOOL bOdd = FALSE;
       for(i = 0; i < pbmh->biHeight; i++) {
          pucPixel = pucLine;
          for(j = 0; j < pbmh->biHeight; j++) {
             if(bOdd) *pucPixel = (BYTE)((*pwData++ >> 12) << 4);
             else *pucPixel++ |= (BYTE)(*pwData++ >> 12);
             bOdd = !bOdd;
          }
          pucLine += dwLineBytes;
       }   RECT rect;
       HDC hDC = ::GetDC(hWnd);   ::GetClientRect(hWnd, &rect);
       ::SetStretchBltMode(COLORONCOLOR);
       ::StretchDIBits(hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0, 0, pbmi->biWidth, pbmi->biHeight, pucBits, pBMInfo, DIB_RGB_COLORS, SRCCOPY);   ::ReleaseDC(hWnd, hDC);
       delete pBits;
       delete pBMInfo;
    }
      

  9.   

         for(j = 0; j < pbmh->biHeight; j++) {
    这句错了,应该是:
         for(j = 0; j < pbmh->biWidth; j++) {
      

  10.   

    另外,在for(j = 0; j < pbmh->biWidth; j++)前面加一句:
    bOdd = FALSE;
      

  11.   

    还是不对,算了,全部重帖一遍吧。前面的请无视。
    //传入参数:
    // hWnd: 显示图像用的窗口
    // pwData:从设备读出的数据(应为501 * 201个WORD型数据)
    // nWidth:图像宽度,应为501
    // nHeight:图像高度,应为201
    void Display(HWND hWnd, const WORD *pwData, int nWidth, int nHeight)
    {
       BITMAPINFO *pBMInfo = (BITMAPINFO *)(new BYTE [sizeof(BITMAPINFOHEADER) + 16 * sizeof(RGBQUARD)];
       BITMAPINFOHEADER *pbmh = &(pBMInfo->bmiHeader);
       RGBQUARD *pPal = &(pBMInfo->bmiColors);   ZeroMemory(pbmh, sizeof(BITMAPINFOHEADER));
       pbmh->biSize = sizeof(BITMAPINFOHEADER);
       pbmh->biWidth = nWidth;
       pbmh->biHeight = nHeight;
       pbmh->biPlanes = 1;
       pbmh->biBitCount = 4;   ZeroMemory(pbmh, sizeof(RGBQUARD) * 16);
       pPal[0].rgbBlue = 0;
       pPal[0].rgbGreen = 0;
       pPal[0].rgbRed = 0;
       pPal[1].rgbBlue = 255;
       pPal[1].rgbGreen = 0;
       pPal[1].rgbRed = 0;
       pPal[2].rgbBlue = 255;
       pPal[2].rgbGreen = 127;
       pPal[2].rgbRed = 0;
       pPal[3].rgbBlue = 255;
       pPal[3].rgbGreen = 255;
       pPal[3].rgbRed = 0;
       pPal[4].rgbBlue = 127;
       pPal[4].rgbGreen = 255;
       pPal[4].rgbRed = 0;
       pPal[5].rgbBlue = 0;
       pPal[5].rgbGreen = 255;
       pPal[5].rgbRed = 0;
       pPal[6].rgbBlue = 0;
       pPal[6].rgbGreen = 255;
       pPal[6].rgbRed = 255;
       pPal[7].rgbBlue = 0;
       pPal[7].rgbGreen = 127;
       pPal[7].rgbRed = 255;
       pPal[8].rgbBlue = 0;
       pPal[8].rgbGreen = 63;
       pPal[8].rgbRed = 255;
       pPal[9].rgbBlue = 0;
       pPal[9].rgbGreen = 0;
       pPal[9].rgbRed = 255;   DWORD dwLineBytes = ((pbmh->biWidth * pbmh->biBitCount + 31) / 32) * 4;
       BYTE *pucBits = new BYTE [dwLineBytes * pbmh->biHeight];
       BYTE *pucLine, *pucPixel;   pucLine = pucBits;
       BOOL bOdd;
       for(i = 0; i < pbmh->biHeight; i++) {
          pucPixel = pucLine;
          bOdd = FALSE;
          for(j = 0; j < pbmh->biWidth; j++) {
             if(!bOdd) *pucPixel = (BYTE)((*pwData++ >> 12) << 4);
             else *pucPixel++ |= (BYTE)(*pwData++ >> 12);
             bOdd = !bOdd;
          }
          pucLine += dwLineBytes;
       }   RECT rect;
       HDC hDC = ::GetDC(hWnd);   ::GetClientRect(hWnd, &rect);
       ::SetStretchBltMode(COLORONCOLOR);
       ::StretchDIBits(hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0, 0, pbmi->biWidth, pbmi->biHeight, pucBits, pBMInfo, DIB_RGB_COLORS, SRCCOPY);   ::ReleaseDC(hWnd, hDC);
       delete pBits;
       delete pBMInfo;
    }
      

  12.   

    我把代码编译了一下,里面的语法和语义好像都还有点问题(呵呵,估计是没有编译过或者以前的代码移过来的),我进行了一些修改,但好像还是无法获得预期的结果,希望能帮忙看一下。下面是我修改了一些编译错误后的代码:
    void CBmpTestDlg::Display( HWND hWnd, const WORD *pwData, int nWidth, int nHeight )
    {
        BITMAPINFO *pBMInfo = (BITMAPINFO *)(new BYTE [sizeof(BITMAPINFOHEADER) + 16 * sizeof(RGBQUAD)]);
        BITMAPINFOHEADER *pbmh = &(pBMInfo->bmiHeader);
        RGBQUAD *pPal = pBMInfo->bmiColors;
        RECT rect;
        HDC hDC = ::GetDC(hWnd);    ZeroMemory(pbmh, sizeof(BITMAPINFOHEADER));
        pbmh->biSize = sizeof(BITMAPINFOHEADER);
        pbmh->biWidth = nWidth;
        pbmh->biHeight = nHeight;
        pbmh->biPlanes = 1;
        pbmh->biBitCount = 4;    ZeroMemory(pPal, sizeof(RGBQUAD) * 16);
        pPal[0].rgbBlue = 0;
        pPal[0].rgbGreen = 0;
        pPal[0].rgbRed = 0;
        pPal[1].rgbBlue = 255;
        pPal[1].rgbGreen = 0;
        pPal[1].rgbRed = 0;
        pPal[2].rgbBlue = 255;
        pPal[2].rgbGreen = 127;
        pPal[2].rgbRed = 0;
        pPal[3].rgbBlue = 255;
        pPal[3].rgbGreen = 255;
        pPal[3].rgbRed = 0;
        pPal[4].rgbBlue = 127;
        pPal[4].rgbGreen = 255;
        pPal[4].rgbRed = 0;
        pPal[5].rgbBlue = 0;
        pPal[5].rgbGreen = 255;
        pPal[5].rgbRed = 0;
        pPal[6].rgbBlue = 0;
        pPal[6].rgbGreen = 255;
        pPal[6].rgbRed = 255;
        pPal[7].rgbBlue = 0;
        pPal[7].rgbGreen = 127;
        pPal[7].rgbRed = 255;
        pPal[8].rgbBlue = 0;
        pPal[8].rgbGreen = 63;
        pPal[8].rgbRed = 255;
        pPal[9].rgbBlue = 0;
        pPal[9].rgbGreen = 0;
        pPal[9].rgbRed = 255;    DWORD dwLineBytes = ((pbmh->biWidth * pbmh->biBitCount + 31) / 32) * 4;
        BYTE *pucBits = new BYTE [dwLineBytes * pbmh->biHeight];
        BYTE *pucLine, *pucPixel;    pucLine = pucBits;
        BOOL bOdd = FALSE;
        for(int i = 0; i < pbmh->biWidth; i++) {
            pucPixel = pucLine;
            bOdd = FALSE;
            for(int j = 0; j < pbmh->biHeight; j++) {
                if(bOdd) *pucPixel = (BYTE)((*pwData++ >> 12) << 4);
                else *pucPixel++ |= (BYTE)(*pwData++ >> 12);
                bOdd = !bOdd;
            }
            pucLine += dwLineBytes;
        }    ::GetClientRect(hWnd, &rect);
        ::SetStretchBltMode(hDC, COLORONCOLOR);
        ::StretchDIBits(hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0, 0, pbmh->biWidth, pbmh->biHeight, pucBits, pBMInfo, DIB_RGB_COLORS, SRCCOPY);    ::ReleaseDC(hWnd, hDC);
        delete pBMInfo;
    }如果需要,我可以把我捕获到的二进制文件发给你,便于调试。如果没时间就算了,但依然要感谢你的帮助!
      

  13.   

    我只是习惯性把RGB(255,255,0)叫做黄色,
    看你文档里的颜色说明,似乎RGB(255,255,0)应该被称作橙色~~
    那么颜色段可以这样分:
    0 黑色     0,  0,  0
    1 蓝色     0,  0,255
    2 浅蓝色   0,  G,255
    3 青色     0,255,255
    4 竹绿色   0,255,  B
    5 绿色     0,255,  0
    7 黄色     R,255,  0
    6 橙色   255,255,  0
    8 桔红色 255,  G,  0
    9 红色   255,  0,  0
    这样,除了蓝到黑是比例稍微有点不同外,其余的红色之间正好隔开一个颜色。
    16楼的创建了4位DIB,忽略了很多颜色哎~~~
    应该创建32位的位图,这样显示出来才显得平滑。
      

  14.   

    嗯,那段代码是随手写的,确实没有编译过。放进编译器试了下,改好的如下:
    void Display(HWND hWnd, const WORD *pwData, int nWidth, int nHeight)
    {
       BITMAPINFO *pBMInfo = (BITMAPINFO *)(new BYTE [sizeof(BITMAPINFOHEADER) + 16 * sizeof(RGBQUAD)]);
       BITMAPINFOHEADER *pbmh = &(pBMInfo->bmiHeader);
       RGBQUAD *pPal = pBMInfo->bmiColors;   ZeroMemory(pbmh, sizeof(BITMAPINFOHEADER));
       pbmh->biSize = sizeof(BITMAPINFOHEADER);
       pbmh->biWidth = nWidth;
       pbmh->biHeight = nHeight;
       pbmh->biPlanes = 1;
       pbmh->biBitCount = 4;   ZeroMemory(pbmh, sizeof(RGBQUAD) * 16);
       pPal[0].rgbBlue = 0;
       pPal[0].rgbGreen = 0;
       pPal[0].rgbRed = 0;
       pPal[1].rgbBlue = 255;
       pPal[1].rgbGreen = 0;
       pPal[1].rgbRed = 0;
       pPal[2].rgbBlue = 255;
       pPal[2].rgbGreen = 127;
       pPal[2].rgbRed = 0;
       pPal[3].rgbBlue = 255;
       pPal[3].rgbGreen = 255;
       pPal[3].rgbRed = 0;
       pPal[4].rgbBlue = 127;
       pPal[4].rgbGreen = 255;
       pPal[4].rgbRed = 0;
       pPal[5].rgbBlue = 0;
       pPal[5].rgbGreen = 255;
       pPal[5].rgbRed = 0;
       pPal[6].rgbBlue = 0;
       pPal[6].rgbGreen = 255;
       pPal[6].rgbRed = 255;
       pPal[7].rgbBlue = 0;
       pPal[7].rgbGreen = 127;
       pPal[7].rgbRed = 255;
       pPal[8].rgbBlue = 0;
       pPal[8].rgbGreen = 63;
       pPal[8].rgbRed = 255;
       pPal[9].rgbBlue = 0;
       pPal[9].rgbGreen = 0;
       pPal[9].rgbRed = 255;   DWORD dwLineBytes = ((pbmh->biWidth * pbmh->biBitCount + 31) / 32) * 4;
       BYTE *pucBits = new BYTE [dwLineBytes * pbmh->biHeight];
       BYTE *pucLine, *pucPixel;   pucLine = pucBits;
       BOOL bOdd;
       for(int i = 0; i < pbmh->biHeight; i++) {
          pucPixel = pucLine;
          bOdd = FALSE;
          for(int j = 0; j < pbmh->biWidth; j++) {
             if(!bOdd) *pucPixel = (BYTE)((*pwData++ >> 12) << 4);
             else *pucPixel++ |= (BYTE)(*pwData++ >> 12);
             bOdd = !bOdd;
          }
          pucLine += dwLineBytes;
       }   RECT rect;
       HDC hDC = ::GetDC(hWnd);   ::GetClientRect(hWnd, &rect);
       ::SetStretchBltMode(hDC, COLORONCOLOR);
       ::StretchDIBits(hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0, 0, pbmh->biWidth, pbmh->biHeight, pucBits, pBMInfo, DIB_RGB_COLORS, SRCCOPY);   ::ReleaseDC(hWnd, hDC);
       delete pucBits;
       delete pBMInfo;
    }
    无法获得预期的结果,那么结果是怎么样的?
      

  15.   

    刚才是没有任何图像,你改了后现在好像出了点图像,但图像跟原图不太一致。
    ZeroMemory(pbmh, sizeof(RGBQUAD) * 16);
    估计应该是笔误,应该是改成下面这样吧:
    ZeroMemory(pPal, sizeof(RGBQUAD) * 16);
    下面是我这边的运行效果图:
    http://hi.csdn.net/space-36689-do-album-picid-614180.html我们要下班了,非常感谢你的帮助。如果您方便的话,希望明天能再给我点帮助,我晚上回去再找点资料看看。谢谢!!
      

  16.   

    代码:
    void CBmpTestDlg::Display( HDC hDC, int nWidth, int nHeight, const WORD *pwData, DWORD dwLen )
    {
        BITMAPINFO bminfo;
        BITMAPINFOHEADER *pbmih = &bminfo.bmiHeader;
        RGBTRIPLE *pPixel = NULL;
        CRect rect;
        DWORD dwPoints = dwLen / sizeof(WORD);
        int nIndex;    COLORREF rgbTable[10] = { RGB(255, 255, 255),     // 白色
            RGB(0, 0, 156),   // 蓝色
            RGB(0, 60, 231),  // 浅蓝色
            RGB(0, 207, 231), // 青色
            RGB(33, 227, 0),  // 竹绿色
            RGB(222, 227, 0), // 黄色
            RGB(214, 166, 0), // 橙色
            RGB(231, 20, 0),  // 桔红色
            RGB(165, 0, 0)    // 红色
        };    pbmih->biSize = sizeof(BITMAPINFOHEADER);
        pbmih->biBitCount = 24;
        pbmih->biClrImportant = 0;
        pbmih->biClrUsed = 0;
        pbmih->biCompression    = BI_RGB;
        pbmih->biHeight = nHeight;
        pbmih->biPlanes = 1;
        pbmih->biSizeImage = 0;
        pbmih->biWidth = nWidth;
        pbmih->biXPelsPerMeter  = 0;
        pbmih->biYPelsPerMeter  = 0;    DWORD dwLineBytes = ( pbmih->biWidth * pbmih->biBitCount + 31 / 32) * 4;
        BYTE *pBytes = new BYTE[dwLineBytes * nHeight];
        pPixel = (RGBTRIPLE *)pBytes;    for( DWORD i = 0; i < dwPoints; i++ )
        {
            switch( pwData[i] )
            {
                case 0: nIndex = 0; break;
                case 1: nIndex = 1; break;
                case 2: nIndex = 2; break;
                case 3: nIndex = 3; break;
                case 4: nIndex = 4; break;
                case 5: nIndex = 5; break;
                case 6: nIndex = 6; break;
                case 7: nIndex = 7; break;
                case 8: nIndex = 8; break;
                case 9: nIndex = 9; break;
                default: nIndex = 9; break;
            }
            pPixel[i].rgbtRed   = GetRValue( rgbTable[nIndex] );
            pPixel[i].rgbtGreen = GetGValue( rgbTable[nIndex] );
            pPixel[i].rgbtBlue  = GetBValue( rgbTable[nIndex] );
        }    GetClientRect( rect );
        ::SetStretchBltMode( hDC,   COLORONCOLOR );
        ::StretchDIBits( hDC, rect.left, rect.top, rect.Width(), rect.Height(), 0, 0, nWidth, nHeight, (LPBYTE)pPixel, &bminfo, DIB_RGB_COLORS, SRCCOPY );    ::ReleaseDC( m_hWnd, hDC );
        delete pPixel;
    }
    效果图:http://hi.csdn.net/space-36689-do-album-picid-614678.html
      

  17.   

    你没有做行字节对齐。DIB的每一行必须是四字节的整数倍,不是的话就要把它补上几个字节。所以像for( DWORD i = 0; i < dwPoints; i++ )这种单循环是不行的。
      

  18.   

    文档里的颜色说明是这样的:
        COLORREF rgbTable[10] = { RGB(255, 255, 255), // 白色
            RGB(0, 0, 156),   // 蓝色
            RGB(0, 60, 231),  // 浅蓝色
            RGB(0, 207, 231), // 青色
            RGB(33, 227, 0),  // 竹绿色
            RGB(222, 227, 0), // 黄色
            RGB(214, 166, 0), // 橙色
            RGB(231, 20, 0),  // 桔红色
            RGB(165, 0, 0)    // 红色
        };
    怎么有白色的?而且其他的颜色RGB数字毫无规律,
    跟我在18楼写的完全不一样。
    你switch那里错了。你把大于9的数都处理成9了。- -
    应该先把pwData[i]除以65535再乘以9,看结果处在0-9的哪个区间,比如:
    pwData[i]=65534,则60000/65535*9=8.24,
    则它处在:
    8 桔红色 255, G, 0//G=127.5
    9 红色   255, 0, 0
    之间。
    而这之间的颜色只是绿色分量不同。
    那么你只要把127.5*(9-8.24)=96.9
    则该点的颜色为RGB(255,96,0)。
    另外把RGBTRIPLE通通改为RGBQUAD。
    把for循环改为如下形式:
    for(int i = 0; i < pbmih->biHeight; i++) {
          for(int j = 0; j < pbmih->biWidth; j++) {
          //代码
          }
          pucLine += dwLineBytes;
       }
    然后在StretchDIBits之前把:
    pbmih->biHeight再赋值为一个负值:
    pbmih->biHeight  = -nHeight;
      

  19.   

    你是24位的,RGBTRIPLE 不用改成 RGBQUAD - -
      

  20.   

    嗯,非常感谢啊,谢谢你俩了!现在是修改后的效果图:
    按说应该满窗口的,但图像变窄了。我再找找原因
        int s_nClrArrayNum = CreateColorArray();    pbmih->biSize = sizeof(BITMAPINFOHEADER);
        pbmih->biBitCount = 24;
        pbmih->biClrImportant = 0;
        pbmih->biClrUsed = 0;
        pbmih->biCompression    = BI_RGB;
        pbmih->biHeight = -nHeight;
        pbmih->biPlanes = 1;
        pbmih->biSizeImage = 0;
        pbmih->biWidth = nWidth;
        pbmih->biXPelsPerMeter  = 0;
        pbmih->biYPelsPerMeter  = 0;    DWORD dwLineBytes = ( (pbmih->biWidth * pbmih->biBitCount + 31) / 32) * 4;
        BYTE *pBytes = new BYTE[dwLineBytes * nHeight];    for( DWORD i = 0; i < nHeight; i++ )
        {
            for( DWORD j = 0; j < nWidth; j++ )
            {
                nIndex = pwData[i * nWidth + j] * s_nClrArrayNum/65535;            pPixel = (RGBTRIPLE *)(pBytes + i * dwLineBytes + j);            pPixel->rgbtRed   = GetRValue( s_crColorArray[nIndex] );
                pPixel->rgbtGreen = GetGValue( s_crColorArray[nIndex] );
                pPixel->rgbtBlue  = GetBValue( s_crColorArray[nIndex] );
            }
        }    GetClientRect( rect );
        ::SetStretchBltMode( hDC,   COLORONCOLOR );
        ::StretchDIBits( hDC, rect.left, rect.top, rect.Width(), rect.Height(), 0, 0, nWidth, nHeight, (LPBYTE)pBytes, &bminfo, DIB_RGB_COLORS, SRCCOPY );
      

  21.   

    终于出来了,下面是效果图:感谢xxd_qd和hastings两位朋友,特别是xxd_qd!下面贴上代码:void CBmpTestDlg::Display( HDC hDC, int nWidth, int nHeight, const WORD *pwData, DWORD dwLen )
    {
        BITMAPINFO bminfo;
        BITMAPINFOHEADER *pbmih = &bminfo.bmiHeader;
        CRect rect;
        RGBTRIPLE *pPixel;
        DWORD dwPoints = dwLen / sizeof(WORD);
        int nIndex;    int s_nClrArrayNum = CreateColorArray();    pbmih->biSize = sizeof(BITMAPINFOHEADER);
        pbmih->biBitCount = 24;
        pbmih->biClrImportant = 0;
        pbmih->biClrUsed = 0;
        pbmih->biCompression    = BI_RGB;
        pbmih->biHeight = -nHeight;
        pbmih->biPlanes = 1;
        pbmih->biSizeImage = 0;
        pbmih->biWidth = nWidth;
        pbmih->biXPelsPerMeter  = 0;
        pbmih->biYPelsPerMeter  = 0;    DWORD dwLineBytes = ( (pbmih->biWidth * pbmih->biBitCount + 31) / 32) * 4;
        BYTE *pBytes = new BYTE[dwLineBytes * nHeight];    for( DWORD i = 0; i < nHeight; i++ )
        {
            for( DWORD j = 0; j < nWidth; j++ )
            {
                pPixel = (RGBTRIPLE *)(pBytes + i * dwLineBytes + j * pbmih->biBitCount / 8);            nIndex = pwData[i * nWidth + j] * s_nClrArrayNum / 65535;            
                pPixel->rgbtRed   = GetRValue( s_crColorArray[nIndex] );
                pPixel->rgbtGreen = GetGValue( s_crColorArray[nIndex] );
                pPixel->rgbtBlue  = GetBValue( s_crColorArray[nIndex] );
            }
        }    GetClientRect( rect );
        ::SetStretchBltMode( hDC,   COLORONCOLOR );
        ::StretchDIBits( hDC, rect.left, rect.top, rect.Width(), rect.Height(), 0, 0, nWidth, nHeight, (LPBYTE)pBytes, &bminfo, DIB_RGB_COLORS, SRCCOPY );    ::ReleaseDC( m_hWnd, hDC );
        delete pBytes;
    }