Skalierung von Bildern mit Transparenz

Status
Nicht offen für weitere Antworten.

Liathne

Mitglied
Guten Morgen zusammen,

ich habe eine kleine GUI gebastelt, mit der es möglich ist, Bilder auf eine vorgegebene Größe zu skalieren.
Nun habe ich folgendes Problem:
Es kann durchaus vorkommen, das ein Bild Transparenz enthält. Hierbei entsteht beim skalieren am Übergang zwischen Nicht-Transparenz und Transparenz ein unschöner Balken. Ich gehe davon aus, er entsteht, da bei der Berechnung der Pixelfarben die Transparenz mit einbezogen wird. Lässt sich dieser Balken auf irgendeine Weise verhindern?

Meine Skalierungsmethode lautet wie folgt:

Code:
 public static BufferedImage getScaledInstance(BufferedImage img,
            int targetWidth,
            int targetHeight,
            boolean higherQuality) throws Exception {
        int type = (img.getTransparency() == Transparency.OPAQUE) ?
            BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage ret = (BufferedImage)img;
        int w, h;
        if (higherQuality) {
            // Use multi-step technique: start with original size, then
            // scale down in multiple passes with drawImage()
            // until the target size is reached
            w = img.getWidth();
            h = img.getHeight();
        } else {
            // Use one-step technique: scale directly from original
            // size to target size with a single drawImage() call
            w = targetWidth;
            h = targetHeight;
        }
        
        do {
            if (higherQuality && w > targetWidth) {
                w /= 2;
                if (w < targetWidth) {
                    w = targetWidth;
                }
            }
            
            if (higherQuality && h > targetHeight) {
                h /= 2;
                if (h < targetHeight) {
                    h = targetHeight;
                }
            }
            
            BufferedImage tmp = new BufferedImage(w, h, type);
            Graphics2D g2 = tmp.createGraphics();
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.drawImage(ret, 0, 0, w, h, null);
            g2.dispose();
            
            ret = tmp;
        } while (w != targetWidth || h != targetHeight);
        
        return ret;
    }

Vielen Dank für Eure Mühe

Liathne
 

Liathne

Mitglied
Ich lag wie ich inzwischen festgestellt habe mit meiner Anfangsvermutung, dass es am Skalierungsalgo liegt falsch.
Das Problem liegt woanders. Nach der Skalierung setzte ich anstelle des Alpha-Kanals eine vorher definierte Farbe und wandle das BufferedImage in TYPE_INT_RGB um. Hierdurch entsteht der schwarze Balken, da meine Methode nicht alle Pixel füllt.
Was das Problem auf folgende Methode verlagert:

Code:
public static BufferedImage getTransparenz(BufferedImage img) throws Exception{
        int w = img.getWidth(), h = img.getHeight();
        for (int x=0;x<w;++x){
            for (int y=0;y<h;++y){
                int argb  = img.getRGB( x, y );
                int alpha = (argb >> 24) & 0xff;
                if (alpha == 0){
                    int purple = new Color(255, 0, 128).getRGB();
                    img.setRGB( x, y, purple );
                }
            }
        }
        return createBufferedRGBImage(img);
    }

Wo liegt mein Fehler, weshalb werden nicht alle transparente Pixel gefüllt?

Liathne
 

The_S

Top Contributor
mal ganz davon abgesehen, dass die Methode nicht gerade performant ist, ignorierst du in deinen Schleifen die erste Pixel-Zeile und Spalte. Du musst in deinen Schleifen "x++" und "y++" und nicht "++x" und "++y" schreiben. Außerdem kann der Alpha-Kanal einen beliebigen Wert zwischen 0 und 255 annehmen (Teiltransparenz), du überprüfst aber lediglich auf absolute Transparenz.
 

The_S

Top Contributor
Performance:

nicht alle Variablen in der Schleife bei jedem Durchlauf neu erzeugen. z. B.:

Code:
int purple = new Color(255, 0, 128).getRGB();

leg dir die Variable purple außerhalb der Schleifen an.

Teiltransparenz:

Anstelle auf alpha == 0 überprüfen ob Alpha zwischen 0 und 254 liegt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Skalierung eines Polygons ohne das es verschoben wird Spiele- und Multimedia-Programmierung 3
A kurze Frage zu Java3D! (automatische Skalierung) Spiele- und Multimedia-Programmierung 3
AmsananKING Arraylist von allen bildern filtern und sortieren Spiele- und Multimedia-Programmierung 11
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
J Anzeige von Bildern Spiele- und Multimedia-Programmierung 5
P Verwendung von JAI und das Splitten von Bildern Spiele- und Multimedia-Programmierung 4
M pixel perfect collision detection bei rotierenden Bildern Spiele- und Multimedia-Programmierung 13
T Bibliothek zum Verkleinern von Bildern (alle Fomate) Spiele- und Multimedia-Programmierung 3
A skallieren von Bildern Spiele- und Multimedia-Programmierung 8
Y Höhe und Breite von Bildern? Spiele- und Multimedia-Programmierung 4
D Probleme beim Download von GIF-Bildern Spiele- und Multimedia-Programmierung 4
M Tiefenwerte bei 2D Bildern abfragen Spiele- und Multimedia-Programmierung 3
G Polygonfläche vom Würfel mit Bildern füllen Spiele- und Multimedia-Programmierung 5
P 2D Spiel mir drehbaren Bildern (Sprites) programmieren Spiele- und Multimedia-Programmierung 10
P Problem mit PNG Bildern Spiele- und Multimedia-Programmierung 16
T Collision mit Bildern Spiele- und Multimedia-Programmierung 3
L Transparenz wird magenta Spiele- und Multimedia-Programmierung 3
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
F OpenGL - Transparenz mit Depth Peeling Spiele- und Multimedia-Programmierung 0
aze Java3D:Farbige Flächen verschwinden lassen(Transparenz- oder Colorinterpolator?)) Spiele- und Multimedia-Programmierung 5
BattleMaster246 OpenGL - Transparenz Spiele- und Multimedia-Programmierung 10
I JOGL: Problem mit Blending bei Billboards (Transparenz) Spiele- und Multimedia-Programmierung 2
L Java 3 D - Transparenz einzelner Punkte Spiele- und Multimedia-Programmierung 6
Z Transparenz in BufferedImage Spiele- und Multimedia-Programmierung 8
G Punkt in Image auf Transparenz prüfen Spiele- und Multimedia-Programmierung 6
G Transparenz - Geschwindigkeit Spiele- und Multimedia-Programmierung 3
G png transparenz geschwindigkeitsproblem Spiele- und Multimedia-Programmierung 2
S Fehlerhafte Darstellung durch Transparenz? Spiele- und Multimedia-Programmierung 8
D 2 Texturen & transparenz Spiele- und Multimedia-Programmierung 16
S transparenz per paint()-methode will nicht Spiele- und Multimedia-Programmierung 12

Ähnliche Java Themen

Neue Themen


Oben