Я хочу конвертировать файл векторного изображения .emf в .bmp, используя API Win32 и C / C ++.
Работает с квадратным изображением. Но я не знаю, как получить соотношение размера изображения .emf, когда оно прямоугольное.
Структура ENHMETAHEADER, заполненная функцией GetEnhMetaFileHeader (), похоже, не содержит правильной информации.
rclBounds и rclFrame структуры ENHMETAHEADER дают эквивалентную ширину и высоту, в то время как мое изображение .emf явно прямоугольное (высота должна быть почти в два раза больше ширины с моим тестовым изображением).
Как я могу получить это соотношение? как софт вроде irfanview это сделал?
Вот код, который я использую, чтобы получить ширину изображения и высоту:
BOOL CConvertEMFToBMP::ConvertToBMP(const char* strFileName, const char* strBMPFile, int w, int h, int div, int indexX, int indexY)
{
HENHMETAFILE hemf;
HBITMAP bitmap;
HDC memDC;
ENHMETAHEADER emh;
HDC dc = ::GetDC(NULL);
hemf = ::GetEnhMetaFileA(strFileName);
ZeroMemory(&emh, sizeof(ENHMETAHEADER));
emh.nSize = sizeof(ENHMETAHEADER);
if (GetEnhMetaFileHeader(hemf, sizeof(ENHMETAHEADER), &emh) == 0)
{
DeleteEnhMetaFile(hemf);
printf("Error: Can't get EnhMetaFileHeader\n");
return FALSE;
}
long frameWidth = emh.rclFrame.right - emh.rclFrame.left;
long frameHeight = emh.rclFrame.bottom - emh.rclFrame.top;
RECT rect;
long width = emh.rclBounds.right - emh.rclBounds.left;
long height = emh.rclBounds.bottom - emh.rclBounds.top;
...
}
С моим изображением .emf:
Под IrfanView:
Оригинальный размер: 38208 x 52340 пикселей (1999,81 мегапикселей) (1,37)
Текущий размер: 19104 x 26170 пикселей (499,95 МП) (1,37)
Используя мой код:
ширина = 165091
высота = 165069
Но для некоторого изображения это работает ...
Пример с другим изображением:
Под IrfanView:
Оригинальный размер: 9921 x 14030 пикселей (139,19 мкс) (1,41)
Текущий размер: 9921 x 14030 пикселей (139,19 мкс) (1,41)
Используя мой код:
ширина = 9920
высота = 14030