2008-09-20 29 views
5

Potrzebuję wstawić gradientową ramkę alfa wokół obrazu. Mój problem polega na łączeniu narożników, aby były gładkie w miejscu, gdzie spotykają się poziome i pionowe gradienty. Uważam, że istnieje standardowy algorytm, który rozwiązuje ten problem. Wydaje mi się, że spotkałem go w szkole wiele lat temu. Ale nie udało mi się znaleźć żadnego odniesienia do jednego z wielu wyszukiwań w Internecie.Algorytm do mieszania wypełnionych gradientem narożników na obrazku

(I wdrożyliśmy promienistym wypełnienia w kącie, ale przejście nie jest jeszcze na tyle gładka.)

moje pytania:

  1. Jeśli jest to standardowy algorytm ten problem, jak nazywa się to , a jak to jest zaimplementowane?

  2. rezygnując dowolnego standardowego algorytmu, co jest najlepszym sposobem, aby określić żądaną wartość piksela do uzyskania gładkiej gradientu w kątach? (Łagodne przejście od pionowej gradient poziomej gradientu.)

EDIT Więc wyobrazić mam obraz będę wstawiać na szczycie większego obrazu. Większy obraz ma jednolitą czerń, a mniejszy obraz jest biały. Zanim go wstawię, chcę połączyć mniejszy obraz w większy, ustawiając wartość alfa na mniejszym obrazie, aby utworzyć przezroczyste "obramowanie" wokół niego, aby "zniknął" w większym obrazie. Zrobione poprawnie, powinienem mieć gładki gradient od czerni do bieli, i robię wszystko z wyjątkiem naroży i wewnętrznej krawędzi.

Na krawędzi granicy gradientu w pobliżu środka obrazu wartość będzie wynosić 255 (nieprzezroczyste). Gdy granica zbliża się do krawędzi zewnętrznej, wartość alfa zbliża się do 0. W rogach obrazu, gdzie spotykają się pionowe krawędzie pionowe, kończysz z linią ukośną. Chcę wyeliminować tę linię i przejść płynnie.

Potrzebuję algorytmu, który określa wartość alfa (0-255) dla każdego piksela, który zachodzi w narożniku obrazu, gdy spotykają się poziome i pionowe krawędzie.

Odpowiedz

2

Prawdopodobnie mnożysz dwa gradienty tam, gdzie się pokrywają, prawda?

Dunno o standardowym algorytmie. Ale jeśli użyjesz gradientu w kształcie signoidu zamiast liniowego, to powinno to wyeliminować widoczną krawędź, w której oba zachodzą na siebie.

prosta funkcja esicy jest smoothstep (t) = T t (3 - 2 * t), gdzie t = 0 < < = 1

+0

To wygląda obiecująco. Nie jestem pewien, czy chcę z messy XNA (jest to aplikacja C# i myślę, że XNA jest najlepszy (tylko?) sposób na uzyskanie płynnego kroku), ale teraz testuję go i zdecyduję, czy chcę go użyć, czy przetestować na podstawie wyników. – TMarshall

+0

Smoothstep to tylko (bardzo prosta) funkcja, którą opisałem; to było na jonie i nie dotyczy wyłącznie XNA. –

+0

Po prostu wykonałem implementację - podczas gdy krawędzie gradientu są ładniejsze, rogi mają ten sam problem. Prawdziwym problemem jest złudzenie optyczne stworzone przez gradienty. Nie ma "błędu" dla liniowego lub płynnego przejścia, ale nadal "widzisz" linię, chyba że zablokujesz reset gradientu z twojej wizji. –

0

Jeśli nie potrzebujesz do zmiany rozmiaru, możesz po prostu użyć prostej mapy alfa.

Jednak kiedyś użyłem prostego gaussowskiego zniknięcia, ze średnią w miejscu, w którym chciałem, aby było to ostatnie całkowicie nieprzezroczyste piksele. Jeśli to ma sens.