我从自定义网络摄像头接收视频数据,并在需要时我们需要保存图像。出于验证目的,客户希望每英寸点数(在位图标题中)为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