So geben Sie das Verhalten von Java BufferedImage -Größe an: benötigen Sie Min für Pixelreihen anstatt im Durchschnitt

StackOverflow https://stackoverflow.com/questions/2540009

Frage

Ich möchte eine Größe eines Java-Buffens ändern und es vertikal kleiner machen, ohne jedoch irgendeine Art von Mittelung zu verwenden. Wenn eine Pixelreihe im Quellbild "leer" (weiß) ist, gibt es eine weiße Pixelreihe in der Entsprechende Position des Zielbildes: Die "min" -Operation. Die Standardalgorithmen (angegeben in GetCaledInstance) Erlauben Sie mir keine feinkörnige Kontrolle. Ich möchte die folgende Logik implementieren:

for each pixel row in the w-pixels wide destination image, d = pixel[w]
   find the corresponding j pixel rows of the source image, s[][] = pixel[j][w]
   write the new line of pixels, so that d[i] = min(s[j][i]) over all j, i

Ich habe weitergelesen SCALEOP, aber nicht herausgefunden haben, wie diese Funktionalität implementiert werden kann - es ist zugegebenermaßen eine seltsame Art der Skalierung. Kann mir jemand Hinweise dafür geben, wie es das macht? Im schlimmsten Fall kann ich einfach das Ziel imagebuffer reservieren und die Pixel nach dem Pseudocode kopieren, aber ich habe mich gefragt, ob es einen besseren Weg gibt.

War es hilfreich?

Lösung

Die SCALEOP -Methoden umfassen einen Parameter namens RenderingHints. Es gibt einen Hinweis namens namens KEY_INTERPOLATION Das entscheidet die Farbe, die beim Skalieren eines Bildes verwendet werden soll.

Wenn Sie den Wert verwenden VALUE_INTERPOLATION_NEAREST_NEIGHBOR Für die Key_Interpolation verwendet Java die Originalfarben, anstatt eine Art Algorithmus zu verwenden, um die neuen Farben neu zu berechnen.

Anstelle von weißen Linien, die sich in grau oder einer Mischung aus Farbe verwandeln, erhalten Sie entweder weiße Linien oder Sie erhalten überhaupt keine Linien. Es hängt alles vom Skalierungsfaktor ab und wenn es sich um eine gleichmäßige oder ungerade Reihe handelt. Wenn Sie beispielsweise um die Hälfte skalieren, hat jede horizontale 1 -Pixel -Linie mindestens 50% Änderung des Erscheinens im neuen Bild. Wenn die weißen Linien jedoch zwei Pixel in Höhe wären, hätten Sie eine 100% ige Chance, dass die weiße Linie erscheint.

Dies ist wahrscheinlich das nächste, was Sie als Ihre eigene Skalierungsmethode schreiben werden. Leider sehe ich keine anderen Hinweise, die weiter helfen könnten.

Um Ihre eigene Skalierungsmethode zu implementieren, können Sie eine neue Klasse erstellen, die die implementiert BufferedImageOp Schnittstelle und implementieren Sie die filter() Methode. Verwenden getRGB() und setRGB() Auf dem BufferedImage -Objekt, um die Pixel aus dem Originalbild zu erhalten, und die Pixel auf dem neuen Bild festlegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top