Я получаю видеоданные с пользовательской веб-камеры, и по запросу нам нужно сохранить изображение. В целях проверки клиент хочет, чтобы число точек на дюйм (в заголовке растрового изображения) составляло 400 точек на дюйм. Кроме того, мы не сохраняем растровое изображение, мы просто передаем дескриптор HBITMAP, чтобы они могли обрабатывать и сохранять изображение.
Я пытаюсь изменить DPI растрового изображения с помощью приведенного ниже кода, но, похоже, он игнорирует все, что я установил.
Приложение основано на Windows, использует родной язык C ++ и 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
Задача ещё не решена.
Других решений пока нет …