2012-01-09 14 views
5

Mam problem z renderowaniem metapliku w mojej aplikacji Delphi XE.podczas renderowania metapliku, teksty są za duże

Problem polega na tym, że gdy renderuję metaplik, teksty są zbyt duże. IrfanView i FastReports czyni go tak:

look at the text to the left of the graph

windows 7 Farba czyni go dobrze: (oto co tekst powinien wyglądać)

windows 7 Paint renders it fine

Jakieś pomysły co jest przyczyną tego?

Dziękujemy!

+5

Jak się tworząc plik meta? A co z niektórymi kodami? –

+0

Przyglądając się temu bliżej na prawdziwym komputerze, rozpoznaję tego rodzaju efekt. Widziałem to z wyjściami własnego programu. Myślę, że jest to po prostu sposób, w jaki niektóre pakiety rasteryzują metaplik. Najwyraźniej metaplik jest w porządku, ponieważ jeden pakiet renderuje go dobrze. Innym programem, na który powinieneś spojrzeć, jest Word. Jeśli chcesz eksportować do konsumpcji za pomocą pakietu grafiki rastrowej, wyeksportuj jako bitmapę w formacie PNG. –

+0

dziękuję za uwagi. @DavidHeffernan: metaplik jest tworzony przez mechanizm graficzny innej firmy. –

Odpowiedz

0

Trochę ryzykowne, ale:

Może ma to związek z nowej czcionki systemowej w Vista + że nowsze wsparcia Delphi? Jeśli zdarzyło się to podczas przenoszenia, napraw czcionkę użytą w tmetafile w starej i nowej wersji. Pliki

+2

Bez znajomości kontekstu urządzenia referencyjnego w kodzie z OP, to tylko zgadywanie. –

+0

nie pomyślał o tym. zamierzam porozmawiać ze sprzedawcą. Dziękuję Ci! –

+3

Martin: cóż, właśnie to oznacza "hazard" :-) –

4

emf to tylko lista poleceń GDI. W rzeczywistości mogą być one bardzo łatwo "odtwarzane" przez system, przy użyciu standardowego polecenia Windows GDI (w Delphi, TMetaFile jest tylko opakowaniem wokół tych interfejsów API).

Kiedy IrfanView lub FastReport renderuje treść metaplików, po prostu użyj odpowiednich poleceń systemu Windows GDI. Gdy Windows 7 Paint renderuje zawartość metapliku, korzysta z renderera GDI +. Sądzę nawet, że wewnętrznie konwertuje plik emf na format emf+, a następnie renderuje go za pomocą antyaliasingu za pomocą GDI +.

Więc jeśli plik emf renderuje nieprawidłowo IrfanView lub FastReport, podejrzewam, to dlatego, że nie jest dobrze metafile tworzą: silnik graficzny osoba trzecia używasz produkuje niestandardowe EMF. Możliwym problemem jest brak używanej czcionki w systemie docelowym, a GDI nie zastępuje czcionki tym samym, co GDI +.

Inną możliwością jest to, że plik emf jest może podwójny Formatowanie : zawiera formatu zarówno emf (który nie został prawidłowo utworzony tak nie jest wyświetlana poprawnie używając GDI) oraz format emf+ (który jest renderowany zgodnie z oczekiwaniami przy użyciu GDI +) . Zwykle ten format nie powinien istnieć: nawet oficjalna biblioteka GDI + nie zezwala na zapisanie zawartości metapliku w pliku emf +. Jest to pewnego rodzaju "potworny" format stworzony przez Twoją zewnętrzną bibliotekę.

Proponuję następujący:

  • Pobierz i sprawdź plik emf z EmfExplorer;
  • Spróbuj użyć GDI + do renderowania metapliku;
  • Spróbuj użyć interfejsu API konwertera emf do emf+.

Aby użyć GDI +, spójrz na Open Source SynGdiPlus unit: doda anty-aliasing GDI + do wytworzonej bitmapy. Jest w stanie przekonwertować emf na emf+. Będzie używać natywnego Vista/Seven API (podobnie jak Windows 7 paint) lub zwykłego kodu Delphi pod Windows XP.

+0

+1 Świetna informacja. –

1

Prawdopodobnie przyczyną jest inny rozmiar monitora i współczynnik rozdzielczości ekranu. GDI ma parametry HORZRES, HORZSIZE, VERTRES, VERTSIZE. W większości przypadków HORZRES/VERTRES, HORZSIZE/VERTSIZE (współczynnik rozdzielczości i proporcje ekranu) są takie same i wszystko działa dobrze ... Jeśli jednak są różne (znalazłem kilka przykładów takich zdarzeń na serwerach), zakłada się, że piksel jest prostokątny, powoduje, że LOGFONT.lfWidth zostanie obliczone "niesłusznie". LOGFONT.lfWidth określa współczynnik kształtu znaków, co w końcu powoduje pojawienie się dziwnych liter.

Jednym rozwiązaniem jest zmiana rozdzielczości tak, aby dopasować HORZRES/VERTRES, HORZSIZE/VERTSIZE. Drugim rozwiązaniem jest użycie drukarki DC do renderowania twoich rzeczy. Ustawienie wartości LOGFONT.lfWidth jawnie może pomóc. Również aktualizacja sterownika wideo może pomóc.

Wystąpił ten sam problem, miałem tymczasowy rysunek do płótna metapliku, który używał GetDC(0) jako odniesienia zamiast drukarki DC. Oto kilka linków, które mają ten sam problem:

+0

dziękuję - nauczyłeś mnie czegoś nowego! –

Powiązane problemy