Hoogo wrote:Ob sich das lösen lässt, indem man die Pixel eines Patterns in vorgegebener Reihenfolge durchwandert, immer den nächsten kleineren Nachbarn sucht und den Fehler auf die folgenden Pixel des Patterns weiterreicht, bis man beim letzten ist? Bin mir da nicht so sicher, ob da nicht bei größeren Pattern als 1*2 der Fehler explodiert... Oder ob das auch mit dem normalen nächsten Nachbarn geht?
"Nächst kleinerer Nachbar" ist keine gute Strategie bei 3 Farbkanälen, weil dann alle drei Werte kleiner sein müssten. Solange du Weiß in der Palette hast, ist das technisch kein Problem, aber das Ergebnis stelle ich mir grauenhaft vor. Besser ist es, den nächsten Nachbarn zu suchen und den Fehler mit Vorzeichen weiterzureichen (dann hast du im Prinzip Floyd-Steinberg, nur dass dort der Fehler über das ganze Bild weitergereicht wird).
Wichtig ist, dass der Fehler nur innerhalb des Musterblocks wandert, sonst bekommst du einen jitter.
Mit deinem 1x2-Block könnte man leicht eine Aktion für die Version mit "nächstem Nachbarn" schreiben:
1. Ebene kopieren (=> Ebene 2), mit vorher festgelegter Farbpalette auf 256 Farben reduzieren.
2. Differenz zur ursprünglichen Ebene 1 berechnen, um 1 px nach unten versetzt zur ursprünglichen Ebene addieren (=> Ebene 3). In der Praxis ist das ein bisschen trickreich, weil PL keine negativen Farbwerte kennt
3. Per Ebenenmaske die geraden Zeilen von Ebene 1 und die ungeraden Zeilen von Ebene 2 kombinieren. (Oder auch per Schachbrettmuster.)
Meine Vermutung ist allerdings, dass das 1 x 2 -Dithering im Vergleich zu "Nearest Neighbour" ziemlich wenig bringt.
L.G.
Burkhard.