Правильный способ конвертировать расширенный метафайл в метафайл Windows без округления пикселей
Когда я конвертирую расширенный метафайл (созданный с помощью GDI+ в C#) в метафайл Windows старого стиля, результаты получаются очень грубыми, по-видимому, потому что координаты округляются до ближайшего пикселя экрана. Я вижу это, если я конвертирую либо через
GetWinMetaFileBits(emfh, bits_l, bits, MM_ANISOTROPIC, GetDC(0));
или используя метафайл GDI+::EmfToWmfBits. Предположительно виновником является использование экрана постоянного тока. Эта публикация предлагает использовать принтер DC, который работает для меня, но, очевидно, не будет работать, если у пользователя нет установленных принтеров. Есть ли способ лучше? Я рассмотрел возможность создания постоянного DC-контроллера с высоким разрешением для этой цели, но не могу найти для этого нужной документации, и я также беспокоюсь об используемой оперативной памяти.
2 ответа
Обычный способ - создать DC памяти с гораздо более высоким разрешением, выполнить рендеринг и сохранить его так, как вы хотите. Обратите внимание, что размеры шрифта могут быть испорчены этим.
HDC memDC = CreateCompatibleDC ( hDC );
HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );
SelectObject ( memDC, memBM );
С nWidth, nHeight намного больше.
Бит CreateCompatible должен устанавливать все dpi и т. Д., Но у меня были проблемы, когда шрифты рисовались с фиксированным размером пикселя, а не с измененным масштабом - так что в итоге они имели высоту всего 10 пикселей на изображении с разрешением 10000 пикселей
Спросите Google для ENMETA.EXE
Описание от Microsoft
Пример в загрузке включен.