修改BITMAPINFOHEADER中的PelsPerMeter

时间:2013-07-04 08:47:29

标签: c++ visual-c++ bitmap bitmapimage

我从自定义网络摄像头接收视频数据,并在需要时我们需要保存图像。出于验证目的,客户希望每英寸点数(在位图标题中)为400dpi。此外,我们不保存刚刚传递HBITMAP句柄的位图,因此他们可以处理和保存图像。

我正在尝试使用下面列出的代码修改位图的DPI,但似乎忽略了我设置的内容。

该应用程序基于Windows,使用C ++ native和Visual Studio 2010。

HDC hMemDC;
BITMAPINFO bi;
LONG dpi ;

    // Calculate DPI required by bitmap info header
    dpi = (LONG)(((dotsPerInch * 10000.0) / 254.0) + 0.5) ;

    // Create current Device Context
    hMemDC = CreateCompatibleDC(NULL);


    // Fill in the BITMAPINFOHEADER
    bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bi.bmiHeader.biWidth = image->GetWidth() ;
    bi.bmiHeader.biHeight = image->GetHeight() ;
    bi.bmiHeader.biPlanes = 1;
    bi.bmiHeader.biBitCount = 32;
    bi.bmiHeader.biCompression = BI_RGB;
    bi.bmiHeader.biSizeImage = 4 * image->GetWidth() * image->GetHeight();
    bi.bmiHeader.biSizeImage = 0 ;
    bi.bmiHeader.biXPelsPerMeter = dpi ;
    bi.bmiHeader.biYPelsPerMeter = dpi;
    bi.bmiHeader.biClrUsed = 0;
    bi.bmiHeader.biClrImportant = 0;

    // Pointer to the bitmap data
    RGBQUAD *bits ;

    // Create the bitmap
    HBITMAP hbmp = CreateDIBSection (hMemDC, &bi, DIB_RGB_COLORS, (void **)&bits, NULL, NULL) ;

    // Copy Image data to bitmap
    int pixelCount,lineCount;

    for( lineCount=0 ; lineCount < bi.bmiHeader.biHeight ; ++lineCount )
    {
        for( pixelCount=0 ; pixelCount < bi.bmiHeader.biWidth ; ++pixelCount )
        {
            RGBQUAD lPixel = image->GetPixelColor(pixelCount,lineCount,true);

            *bits = lPixel;
            bits++;

        }
    }

    // Free resource
    DeleteDC(hMemDC);

    return hbmp;

我已经使用生成的句柄将图像保存到磁盘。图像显示正确,但属性仍显示DPI为96。

我怀疑它与设置当前屏幕的设备上下文有关,但我不确定。

图形不是我的事情所以任何帮助都会受到赞赏。

干杯

GWC

0 个答案:

没有答案