2012-01-09 4 views
5

У меня возникла проблема с рендерингом метафайлов в приложении Delphi XE.при рендеринге метафайла, тексты слишком велики

проблема в том, что когда я передаю метафайл, тексты слишком велики. Irfanview и FastReports делают это так:

look at the text to the left of the graph

окна 7 Paint делает это хорошо: (вот что текст должен выглядеть)

windows 7 Paint renders it fine

Любые идеи, что является причиной этого?

Спасибо!

+5

Как вы создаете мета-файл? Как насчет кода? –

+0

Глядя более внимательно на это на реальном компьютере, я признаю такой эффект. Я видел его с выходом моей собственной программы. Я думаю, что это просто характер того, как некоторые пакеты растеризуют метафайл. Очевидно, что метафайл является точным, потому что один пакет отлично отображает его. Другая программа, на которую вы должны обратить внимание, - это Word. Если вы хотите экспортировать для потребления растровым графическим пакетом, тогда экспортируйте его как растровое изображение в формате PNG. –

+0

благодарю вас за ваши комментарии. @DavidHeffernan: метафайл создается графическим движком третьей стороны. –

ответ

0

Немного азартной игры, но:

Может быть связано с новой системой шрифтов в Vista +, что новую поддержку в Delphi? Если это произошло во время портирования, закрепите шрифт, используемый в tmetafile в старой и новой версиях.

+2

Без знания контекста ссылочного устройства в коде из OP это просто гадание. –

+0

не думал об этом. я собираюсь поговорить с продавцом. Спасибо! –

+3

Мартин: Ну, вот что такое «игра» означает :-) –

4

emf Файлы - это всего лишь список команд GDI. Фактически, их можно легко «воспроизвести» системой, используя стандартную команду Windows GDI (в Delphi TMetaFile - это всего лишь оболочка этих API).

Когда IrfanView или FastReport оказывает содержание метафайл, они просто используют соответствующие команды для Windows GDI. Когда Windows 7 Paint отображает содержимое метафайла, он использует средство визуализации GDI +. Я даже думаю, что он внутренне конвертирует файл emf в формат emf+, а затем визуализирует его с помощью антиалиасинга с использованием GDI +.

Таким образом, если файл emf делает неправильно в IrfanView или FastReport, я подозреваю, что это потому, что ваш метафайл не хорошо сформирован: третья сторона графического движка вы используете производство нестандартного эдса. Возможная проблема заключается в том, что используемый шрифт отсутствует в целевой системе, а GDI не заменяет шрифт тем же, что и GDI +.

Другая возможность состоит в том, что файл emf это может быть двойной формат : он содержит как emf формат (который не был должным образом создан так не отображается правильно с помощью GDI) и формат emf+ (который показан как ожидается, с использованием GDI +) , Обычно этот двойной форматemf/emf+ не должен существовать: даже официальная библиотека GDI + не позволяет сохранять содержимое метафайла в emf +. Это своего рода «монстр», созданный вашей сторонней библиотекой.

Я предлагаю следующее:

  • Скачать и проверить файл emf с EmfExplorer;
  • Попробуйте использовать GDI + для рендеринга метафайла;
  • Попробуйте использовать преобразователь API emf на emf+.

Для использования GDI + ознакомьтесь с открытым исходным кодом SynGdiPlus unit: он добавит GDI + anti-aliaising к вашему созданному растровому изображению. Он способен конвертировать emf в emf+. Он будет использовать собственный API Vista/Seven (как и краска для Windows 7) или простой код Delphi под Windows XP.

+0

+1 Отличная информация. –

1

Причина, вероятно, в том, что разные размеры монитора и разрешение экрана. GDI имеет параметры HORZRES, HORZSIZE, VERTRES, VERTSIZE. В большинстве случаев HORZRES/VERTRES, HORZSIZE/VERTSIZE (коэффициент разрешения и соотношение сторон экрана) одинаковы, и все работает хорошо ... Однако, если они отличаются (я нашел несколько примеров этого на серверах), то пиксель считается прямоугольным, это причины LOGFONT.lfWidth рассчитываться «неправильно». LOGFONT.lfWidth определяет соотношение сторон символов, и это, наконец, вызывает странные выглядящие буквы.

Одним из решений является изменение разрешения так, чтобы HORZRES/VERTRES, HORZSIZE/VERTSIZE совпадение. Другое решение - использовать принтер DC для рендеринга ваших вещей. Значение значения LOGFONT.lfWidth явно может помочь. Также может помочь обновление видеодрайвера.

Я столкнулся с той же проблемой, у меня был временный рисунок на холсте метафайла, который использовал GetDC(0) в качестве ссылки вместо принтера DC. Вот некоторые ссылки, которые имеют ту же проблему:

+0

спасибо, ты научил меня чему-то новому! –

Смежные вопросы