[PHP] Anti aliasing bij imagesetpixel()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Ik heb met PHP wat geschreven dat een afbeelding iets distort en een lichte screw er aan geeft en daarna een mooi wet floor effect. Werkt allemaal perfect. Alleen omdat ik per pixel bereken waar die pixel moet komen te staan en dan die pixel op het eindresultaat inkleur met imagesetpixel(), komen er mooie harde randen rond de afbeelding. Ik ben dus eigenlijk op zoek naar een algoritme of een methode om hier mooie randen van te maken. Ik kon eigenlijk niets vinden dat iets dergelijks doet en nergens staat beschreven hoe zulke functies werken. Op wat voor manier berekenen programma's zoals Photoshop hoe die pixels verspreid moeten worden of is hier een standaard manier voor?

Overigens, ik ben niet van plan om iets als ImageMagic te gaan gebruiken, dat is niet leuk genoeg. Waarom makkelijk doen als het ook moeilijk kan?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Implementeer een backwards transform en interpoleer in het originele beeld.

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Ik moet eerlijk toegeven dat dit (ook na het opgezocht te hebben) totaal nergens aanhaakt. Wat moet ik me daarbij voorstellen?

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 19:11
Als performance niet belangrijk is, is supersampling waarschijnlijk de eenvoudigste oplossing. Als je een invoer hebt van 100x200 pixels schaal je 'm eerst op naar 200x400 of 400x800 ofzo, dan voer je er je operaties op uit, en dan schaal je het resultaat terug naar 100x200 (met resampling natuurlijk, anders heb je er nog niets aan).

HuHu's oplossing is fundamenteel beter maar of het werkt hangt een beetje af van wat je probeert te doen en het is waarschijnlijk ingewikkelder om te implementeren. Je moet dan waarschijnlijk alsnog op een ingewikkeldere manier pixels uit het oorspronkelijke plaatje samplen.

Acties:
  • 0 Henk 'm!

  • GWTommy
  • Registratie: Mei 2008
  • Laatst online: 05-08-2023
Soultaker schreef op woensdag 01 februari 2012 @ 18:32:
Als performance niet belangrijk is, is supersampling waarschijnlijk de eenvoudigste oplossing. Als je een invoer hebt van 100x200 pixels schaal je 'm eerst op naar 200x400 of 400x800 ofzo, dan voer je er je operaties op uit, en dan schaal je het resultaat terug naar 100x200 (met resampling natuurlijk, anders heb je er nog niets aan).

HuHu's oplossing is fundamenteel beter maar of het werkt hangt een beetje af van wat je probeert te doen en het is waarschijnlijk ingewikkelder om te implementeren. Je moet dan waarschijnlijk alsnog op een ingewikkeldere manier pixels uit het oorspronkelijke plaatje samplen.
Performance is niet belangrijk, het gaat met maximaal één afbeelding per dag en gebeurt niet on the fly.
Ik ga eens kijken of dat 'supersampling' wat is. In theorie klinkt het natuurlijk goed.

Eigenlijk heb ik zoiets al geprobeerd (zelf bedacht), maar een denkfout gemaakt. Ik heb namelijk na de bewerkingen de afbeelding tot 25 keer zo groot gemaakt en toen weer terug naar origineel. Achteraf gezien heeft dit dus geen effect en is jouw manier de beste. Ik laat mijn bevindingen hier achter.

Echter een stukje leesvoor over bovenstaande termen zou ik ook niet erg vinden (het klink namelijk interessant), ik kan op google niet veel er over vinden helaas.

Edit:
Het werkt. Alleen heeft het geen effect op de kwaliteit als ik de afbeelding 4 keer vergroot of 10 keer ok een heel klein beetje, wel op de snelheid. En natuurlijk wordt m'n transparantie van m'n PNG niet meegenomen met imagecopyresampled(). * Google *

Nice:
Van: http://webdevelopmenttricks.com/artwork/pic.png
Naar: http://webdevelopmenttricks.com/artwork/artwork.png

[ Voor 16% gewijzigd door GWTommy op 01-02-2012 19:21 ]


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
GWTommy schreef op woensdag 01 februari 2012 @ 18:13:
Ik moet eerlijk toegeven dat dit (ook na het opgezocht te hebben) totaal nergens aanhaakt. Wat moet ik me daarbij voorstellen?
Je hanteert dan het volgende stappenplan:
- eerst maak je het wet floor effect, zonder (!) de distort/skew
- daarna doe je een backwards transform van de distort/skew

Die backwards transform wil het volgende zeggen: nu bepaal je voor elke pixel uit je invoer plaatje waar die terecht komt in het uitvoer plaatje. Dat is de forward-transform, maar deze is (zoals je ook ondervind) niet optimaal vanwege meerdere redenen (die je nog niet eens allemaal ondervind). Daarom "hoor" je een backwards transform te implementeren: voor elke pixel in het uitvoer plaatje bepaal je waar die vandaan kwam uit het invoer plaatje. Wiskundig gezien is dat veel beter en het lost ook meteen je "anti-alias" probleem op.

Als je namelijk bepaalt waar je uitvoer pixel vandaan komt uit het invoer plaatje, dan zul je niet exact op één pixel uitkomen, maar bijvoorbeeld op pixel (43.75, 85.38). Je pakt dan niet de kleur van pixel (43, 85), maar je gaat bilinear (of bi-cubisch, of wat je wilt) interpoleren tussen omliggende pixels.
Pagina: 1