[vb] antialias

Pagina: 1
Acties:

  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Ik ben in een vb bezig om met de BitBlt API kleine bitmaps op een achtergrond te tekenen, met een mask image maak ik deze dan transparant.

Het probleem is dat de randen er vaak erg lelijk uit zien, omdat het een klein aantal pixels gaat. Het zou erg mooi zijn als ik dit zou kunnen antialiassen.

Weet iemand of er voor vb een algoritme bestaat om graphics te antialissen? Of een manier waarop ik dit zou kunnen doen?

Bedankt!

Verwijderd

Je pakt de kleur van de rand (b.v. zwart) en je pakt de kleur van de pixel ernaast (wit) en daar maar je dan een andere pixel van, het gemiddelde van de andere (grijd dus)

Verwijderd

Daarmee vervaag je de bitmap, maar is natuurlijk niet echt anti-alias. Ik had hetzelfde probleem met een ronde commandbutton die ik gemaakt heb. Een goede manier om daar een anti-alias bij te maken is verdomd moeilijk...

[edit] Ik heb dus ook nog geen goede functie gevonden, maar houd me aanbevolen ;)

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Teken een bitmap die vier keer zo groot is als je em wilt hebben en verklein em dan weer vier keer op de manier die KixAss zei: voor een pixel in de uiteindelijk bitmap neem je het gemiddelde van vier in je bronbitmap

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 25 oktober 2001 08:53 schreef Xenophage het volgende:
Teken een bitmap die vier keer zo groot is als je em wilt hebben en verklein em dan weer vier keer op de manier die KixAss zei: voor een pixel in de uiteindelijk bitmap neem je het gemiddelde van vier in je bronbitmap
i.e.: je pakt een percentage van de sterkte voor je Anti Alias (De zijne is 25%). Maar kan dus op een snellere manier dan uitvergroten, veranderen en verkleinen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Zo blur je toch het hele plaatje? Het gaat om de rand tussen het plaatje en de background.

Verwijderd

Kan je geen alpha channel gebruiken ofzo?

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 25 oktober 2001 10:11 schreef Pc123 het volgende:
Zo blur je toch het hele plaatje? Het gaat om de rand tussen het plaatje en de background.
*zucht*

kwestie van een "layer" gebruiken (ander plaatje) daar dezelfde tekst op dezelfde plaats plaatsen, alleen standaard achtergrond kleur. Waardoor je dus de randen kan vinden. Je hebt de randen gevonden dus betekent dat je dat kan gebruiken op het andere plaatje (immers weet je dan de coordinaten van de randen waardoor je alleen de randen gaat "middelen".

That's all.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Het programma heeft twee bitmaps (die door de user bepaald worden), een achtergrond en een klein plaatje (met mask).

Dat kleine plaatje kan bijvoorbeeld een cirkel zijn, de randen daarvan zijn dan erg lelijk.

De rand tussen de cikel en de achtergrond moet dan geantialiassed worden.

In een temp-plaatje heb ik nu dat plaatje en de background bij elkaar zitten, dat plaatje wordt dan op de achtergrond getekend. Het wordt dan transparant.

Tot zo ver werkt alles, nu moet er dus geantialiassed worden.

Wat zou moeten gebeuren is:

1. Eerst de randen van het kleine plaatje opzoeken
2. In het plaatje waar de achtergrond erbij zit een bepaald gebied rond die rand blurren.

1 moet wel te doen zijn, in de mask zoeken waar een witte en een zwarte pixel naast elkaar liggen ofzo.

Als dat zou lukken heb ik de coordinaten van de rand. Maar dan: Er zou geblurred moeten worden in b.v. een cirkel van 3 pixels rond dit punt, dat er zeg maar een kleurovergang komt, maar die moet ook geleidelijk gaan.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 25 oktober 2001 10:31 schreef Pc123 het volgende:
Maar 2, alleen de rand moet dan geblurred worden, hoe zou ik dit kunnen doen.
Zet in je "layer" (wat dus niet KLEINER is maar de exacte ZELFDE afmetingen.. ) overal waar een zwarte punt naast een witte punt staat een rode punt (of een andere afwijkende kleur). (dus je vervangt de zwarte punt met een rode punt). En voor elke instantie heb je dus een punt te pakken. Hierdoor voorkom je ook dat er een punt dubbel "gemiddeld" wordt en dergelijke.

That's all.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 25 oktober 2001 10:31 schreef Pc123 het volgende:
Als dat zou lukken heb ik de coordinaten van de rand. Maar dan: Er zou geblurred moeten worden in b.v. een cirkel van 3 pixels rond dit punt, dat er zeg maar een kleurovergang komt, maar die moet ook geleidelijk gaan.
Bovenstaande doe je 3 keer.. je pakt 3 verschillende kleuren.

Eerst vervang je alle zwarte punten naast witte punten met kleur1
Daarna vervang je alle zwarte punten naast kleur 1 met kleur2.
Daarna vervang je alle zwarte punten naast kleur 2 met kleur 3.

Je zorgt dat in het "origineel" waar kleur 1 geplaatst wordt bijvoorbeeld 50% middeling is. bij kleur2 25% en bij kleur3 maar 10%

even ermee spelen zou ik zeggen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Op donderdag 25 oktober 2001 10:37 schreef dusty het volgende:

[..]

Zet in je "layer" (wat dus niet KLEINER is maar de exacte ZELFDE afmetingen.. ) overal waar een zwarte punt naast een witte punt staat een rode punt (of een andere afwijkende kleur). (dus je vervangt de zwarte punt met een rode punt). En voor elke instantie heb je dus een punt te pakken. Hierdoor voorkom je ook dat er een punt dubbel "gemiddeld" wordt en dergelijke.

That's all.
Ja, maar het gaat dus ook om een antialiassing van een meer dan een pixel.

Zo dus: :?

Ik zou de rand moeten zoeken en voor iedere pixel van die rand het gemiddelde van de omliggende pixels moeten nemen.

Vervolgens de rand 1 pixel naar buiten leggen en het geheel nog n keer doen.

Maar dat laatste is ook niet zo simpel, de rand zou dan zeg maar "uitgerekt moeten worden".

  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Op donderdag 25 oktober 2001 10:40 schreef dusty het volgende:

[..]

Bovenstaande doe je 3 keer.. je pakt 3 verschillende kleuren.

Eerst vervang je alle zwarte punten naast witte punten met kleur1
Daarna vervang je alle zwarte punten naast kleur 1 met kleur2.
Daarna vervang je alle zwarte punten naast kleur 2 met kleur 3.

Je zorgt dat in het "origineel" waar kleur 1 geplaatst wordt bijvoorbeeld 50% middeling is. bij kleur2 25% en bij kleur3 maar 10%

even ermee spelen zou ik zeggen.
Het gaat namelijk om een plaatje met alle mogelijke kleuren op een achtergrond met ook alle mogelijke kleuren.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op donderdag 25 oktober 2001 10:47 schreef Pc123 het volgende:
Het gaat namelijk om een plaatje met alle mogelijke kleuren op een achtergrond met ook alle mogelijke kleuren.
Maar op je "Layer" plaatje hoef je alleen een witte punt te zetten waar er een kleur IS geplaatst. Je hoeft niet op te slaan WELKE kleur is geplaatst. Immers kan je dat opzoeken in "het origineel" dit gaat alleen om het zoeken naar de randen.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Op donderdag 25 oktober 2001 10:49 schreef dusty het volgende:

[..]

Maar op je "Layer" plaatje hoef je alleen een witte punt te zetten waar er een kleur IS geplaatst. Je hoeft niet op te slaan WELKE kleur is geplaatst. Immers kan je dat opzoeken in "het origineel" dit gaat alleen om het zoeken naar de randen.
Ah :)

Ik zal eerst maar eens gaan proberen om dat rand-zoeken werkend te krijgen.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

De enige effectieve manier om het te doen is de manier die ik noemde.

Je hebt een groot plaatje (64x64 of zow) en een 4x kleiner resultaat plaatje (32x32 dus, want het moet 2x2 keer kleiner zijn!). Voor de duidelijkheid, source is het grote (bron)plaatje, en dest het kleine (resultaat)plaatje. Sorry, m'n kennis van VB en graphics is magertjes, maar ik denk dat je snapt wat ik bedoel...
code:
1
2
3
4
5
6
For X = 0 To 31
  For Y = 0 To 31
    kleur = GetPixel(source, X * 2, Y * 2) + GetPixel(source, X * 2 + 1, Y * 2) + GetPixel(X * 2, Y * 2 + 1) + GetPixel(source, X * 2 + 1, Y * 2 + 1) \ 4
    PutPixel(dest, X, Y, kleur)
  Next Y
Next X

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?

Pagina: 1