[.NET] Open-Type over een Bitmap

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
In .NET heb je in principe 2 opties wanneer je tekst over een bitmap wilt tekenen:

TypeMethodeOTFAnti-alias
GDI+Graphics.DrawString-+
GDITextRenderer.DrawText+-


GDI+ werkt redelijk handig en geeft de mooiste resultaten, maar helaas kun je er geen OpenType-lettertypes mee tekenen.

Het alternatief is "gewoon" GDI, dat je kunt aanroepen via System.Windows.Forms.TextRenderer. Deze kan wel omgaan met OpenType, maar heeft dan weer als nadeel dat het onmogelijk lijkt om de anti-aliasing over de bitmap te laten toepassen.

Is er iemand die een alternatief weet om dit irritante probleem te omzeilen?

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

Is er geen mogelijk om het gevraagde font aan te schaffen als reguliere truetype?

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 05-08 09:21

Not Pingu

Dumbass ex machina

De tekst tekenen op een aparte bitmap in 4x of 8x de gewenste grootte, en deze vervolgens via Graphics.DrawImage geschaald op je doelbitmap tekenen? Bij het schalen wordt je tekstbitmap automatisch antialiased.

Daarvoor zet je dus de InterpolationMode property van je Graphics object op bijv. HighQualityBicubic.

[ Voor 20% gewijzigd door Not Pingu op 09-12-2009 11:28 ]

Certified smart block developer op de agile darkchain stack. PM voor info.


Acties:
  • 0 Henk 'm!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
TeeDee schreef op woensdag 09 december 2009 @ 10:05:
Is er geen mogelijk om het gevraagde font aan te schaffen als reguliere truetype?
Tja, het punt is eigenlijk net dat ik ervoor wil zorgen dat het niet uitmaakt welk soort font je aanlevert :)

Ik ga nou met GetGlyphOutline aan de slag, om het font handmatig op een canvas te gooien. Maar ...

[rant]
...wat is me dat GVD een crime zeg! Ik heb net nog de datum gecheckt, en we zijn 2009. GDI+ is geïntroduceerd met Windows XP, 2001 om GDI te vervangen en tot op de fucking dag van vandaag kan GDI+ niet met OpenType overweg! En moet je Godbetert met "klassieke" GDI aan de gang - die daar wel mee overweg kan - om dat probleem op te vangen!
[/rant]
Not Pingu schreef op woensdag 09 december 2009 @ 11:26:
De tekst tekenen op een aparte bitmap in 4x of 8x de gewenste grootte, en deze vervolgens via Graphics.DrawImage geschaald op je doelbitmap tekenen? Bij het schalen wordt je tekstbitmap automatisch antialiased.

Daarvoor zet je dus de InterpolationMode property van je Graphics object op bijv. HighQualityBicubic.
Hmja... ik weet niet zeker of dat het gewenste resultaat zou geven. Ik ga het misschien wel proberen als ik er niet uitkom met GetGlyphOutline. Bedankt voor de tip.

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

GrimaceODespair schreef op woensdag 09 december 2009 @ 11:35:
[...]

Tja, het punt is eigenlijk net dat ik ervoor wil zorgen dat het niet uitmaakt welk soort font je aanlevert :)
Begrijpelijk!
Ik ga nou met GetGlyphOutline aan de slag, om het font handmatig op een canvas te gooien. Maar ...

[rant]
...wat is me dat GVD een crime zeg! Ik heb net nog de datum gecheckt, en we zijn 2009. GDI+ is geïntroduceerd met Windows XP, 2001 om GDI te vervangen en tot op de fucking dag van vandaag kan GDI+ niet met OpenType overweg! En moet je Godbetert met "klassieke" GDI aan de gang - die daar wel mee overweg kan - om dat probleem op te vangen!
[/rant]
Mee eens, ben er in het verleden te vaak tegen aan gelopen dat 'we' niets meer met fonts deden welke niet vanuit ons getest waren.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Not Pingu
  • Registratie: November 2001
  • Laatst online: 05-08 09:21

Not Pingu

Dumbass ex machina

GrimaceODespair schreef op woensdag 09 december 2009 @ 11:35:
Hmja... ik weet niet zeker of dat het gewenste resultaat zou geven. Ik ga het misschien wel proberen als ik er niet uitkom met GetGlyphOutline. Bedankt voor de tip.
In principe is dat de manier waarop antialiasing werkt, volgens mij zou dat hetzelfde resultaat moeten opleveren.

[ Voor 60% gewijzigd door Not Pingu op 09-12-2009 11:39 ]

Certified smart block developer op de agile darkchain stack. PM voor info.


Acties:
  • 0 Henk 'm!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Not Pingu schreef op woensdag 09 december 2009 @ 11:38:
[...]
In principe is dat de manier waarop antialiasing werkt, volgens mij zou dat hetzelfde resultaat moeten opleveren.
Dan moet ik er eerst een transparente bitmap van maken, en die geschaald gaan kopiëren. Ik heb er persoonlijk weinig ervaring mee, maar dan moet GDI dus alfatransparantie gaan toepassing om een effen matte te voorkomen, toch?

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:59

TeeDee

CQB 241

Als ik het goed begrijp wel. Het vervelende nu is, als mijn kennis van GDI me niet in de steek laat, GDI native geen transparency ondersteunt. Hier komt het 'blitten' om de hoek kijken.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Hier heb ik een handig voorbeeld gevonden dat me aardig op weg heeft geholpen.

Ik heb het geheel nu aan het lopen en ik ben meer van fonts aan het leren dan eigenlijk de bedoeling was }:O

Alleen wat betreft kerning heb ik nog een probleem. Ik kan geen kerning toepassen op fonts die geen kerninginformatie hebben. Nu zijn er blijkbaar maar weinig fonts die dat hebben, dus de meesten komen er nu monospaced uit.

Ik heb even wat zitten zoeken op kerning algoritmes, maar ik kan niet zo snel handige informatie daarover vinden. Iemand nog een suggestie?

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Not Pingu schreef op woensdag 09 december 2009 @ 11:38:
[...]


In principe is dat de manier waarop antialiasing werkt, volgens mij zou dat hetzelfde resultaat moeten opleveren.
Dat niet in principe hoe MSAA werkt maar precies zoals MSAA werkt en in dit geval is het zelfs MSAA 4x of 8x. Al heb je zulke hoge resoluties natruulijk niet nodig vreet alleen maar geheugen 2x is meestal al voldoende.

[ Voor 20% gewijzigd door NC83 op 10-12-2009 12:40 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Ik heb het nou als volgt opgelost:
[list]
• Als er kerning informatie beschikbaar is, gebruik ik hem gewoon
• Als er geen kerning informatie beschikbaar is, gebruik ik Graphics.MeasureCharacterRanges om te bepalen waar de karakters terechtkomen


En dat lijkt redelijk goed te werken. Yay *O*

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

Verwijderd

Ongelofelijk... dan is 't bijna 2010 en dan bestaan er nog operating systems die niet eens fatsoenlijk op een makkelijke manier tekst kunnen renderen...

Wat ga je nu doen met je code? Je zou 't misschien in een library kunnen stoppen en als open source dingetje op de wereld los kunnen laten...

Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Verwijderd schreef op vrijdag 11 december 2009 @ 13:56:
Ongelofelijk... dan is 't bijna 2010 en dan bestaan er nog operating systems die niet eens fatsoenlijk op een makkelijke manier tekst kunnen renderen...
Dit is meer een ontwikkel taal probleem dan dat het een OS probleem is. Als er in .Net standaard een oplossing voor dit probleem had gezeten dan had je die opmerking niet gemaakt.

Overigens was de eerste gedachte die ik kreeg bij dit topic om eens te kijken of ze dit in WPF niet beter hebben opgelost. Wellicht n beetje mosterd na de maaltijd aangezien je het al hebt opgelost maar ik vond hier iets: Open-Type fonts WPF.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

NC83 schreef op donderdag 10 december 2009 @ 12:37:
[...]

Dat niet in principe hoe MSAA werkt maar precies zoals MSAA werkt en in dit geval is het zelfs MSAA 4x of 8x. Al heb je zulke hoge resoluties natruulijk niet nodig vreet alleen maar geheugen 2x is meestal al voldoende.
MSAA misschien, maar supersampling is niet de enige manier om AA toe te passen. Zeker bij vector gebaseerde afbeeldingen (want fonts vaak zijn) zijn er efficiëntere manieren te verzinnen die een beter resultaat opleveren.

Als je echter aangewezen bent op een voor geïmplementeerde rendermethode heb je niet veel andere keuze dan supersampling, maar dat is dus niet de enige mogelijke methoden.

Tot slot is er ook nog cleartype, maar dat is nogal afhankelijk van je scherm (maakt ge/mis bruik van de subpixels om een hogere resolutie te faken)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 12:56

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Verwijderd schreef op vrijdag 11 december 2009 @ 13:56:
Wat ga je nu doen met je code? Je zou 't misschien in een library kunnen stoppen en als open source dingetje op de wereld los kunnen laten...
Het overwegen waard. Als het zover komt, lees je't alleszins hier ;)
D-Raven schreef op vrijdag 11 december 2009 @ 14:48:
[...]
Dit is meer een ontwikkel taal probleem dan dat het een OS probleem is. Als er in .Net standaard een oplossing voor dit probleem had gezeten dan had je die opmerking niet gemaakt.
Nou, het probleem bestaat in eerste instantie omdat GDI+, toch een onderdeel van de grafische schil van het OS, gewoon géén ondersteuning heeft voor OpenType fonts. Meer daarover lees je hier. Dat artikel is volgens mij ook de basis van de code die ik dan weer als uitgangspunt heb gebruikt.

Verder wist een bevriend ontwikkelaar die in een ICT-onderzoekscentrum werkt, mij te vertellen dat het wat fonts betreft in veel OS-en anno 2009 huilen met de pet op is.

Tenslotte, als .NET al een oplossing voor dit probleem zou hebben, zou die volgens mij moeten aanleunen bij "mijn" custom implementatie van font rendering, simpelweg omdat plain GDI+ tekort schiet.

Wij onderbreken deze thread voor reclame:
http://kalders.be


Acties:
  • 0 Henk 'm!

Verwijderd

Opentype ondersteuning kan nog veel verder gaan ook dan puur het renderen van de lettervormen. Veel fonts hebben ook ondersteuning voor zgn 'ligatures', waarbij meerdere letters visueel samengevoegd worden tot één karakter. Voorbeeldje:
Afbeeldingslocatie: http://emle.nl/forumpics/got/ligatures.png
Hierboven het font 'hoefler text', met en zonder ligatures ingeschakeld. OSX ondersteunt deze dingen automatisch in vrijwel alle applicaties en zelfs in de normale user interface. Microsoft ondersteunt ze nog niet eens in een tekstverwerker als Word (je kan wel bij de karakters komen, maar dan ziet 'ie ze ook als 1 karakter en werkt spellingscontrole niet meer op dat woord). Er is hoop overigens, WPF schijnt al een automatische support te hebben voor meer opentype features. Zie ook http://fortes.com/2005/03/ligatures/ .
Pagina: 1