2016-12-30 4 views
0

Ich versuche, eine Möglichkeit zum Abtasten einer Textur in Java zu implementieren. Ich möchte, dass dies genauso funktioniert, wie es mit GLSLs "Textur" -Funktion geschieht. Ich möchte, dass die benachbarten Pixel berücksichtigt werden, wenn die Farbe berechnet wird.Interpolieren zwischen Pixeln auf einem Bild

Sagen wir zum Beispiel, ich verwende einen Float, um die Bildfarbe bei einem bestimmten Pixel zu erhalten, und die Zahl fällt zwischen zwei Pixel. Wie kann ich eine Mischung der benachbarten Pixel berechnen? Hier ist ein Bild, das mein Ziel zeigt.

enter image description here

enter image description here

Gibt es eine einfache Möglichkeit, dies zu tun mit BufferedImage Klasse Java?

Hier ist der Code, den ich bisher habe, es funktioniert nur für die x-Position im Moment.

public static final java.awt.Color getColor(final BufferedImage image, final float x, final int y) { 

    final float imageX = x * image.getWidth(); 

    final float decimal = imageX % 1f; 

    final java.awt.Color left = new java.awt.Color(image.getRGB(Maths.clamp((int) imageX - 1, 0, image.getWidth() - 1), y)); 
    final java.awt.Color center = new java.awt.Color(image.getRGB(Maths.clamp((int) imageX, 0, image.getWidth() - 1), y)); 
    final java.awt.Color right = new java.awt.Color(image.getRGB(Maths.clamp((int) imageX + 1, 0, image.getWidth() - 1), y)); 

    if (decimal == 0.5f) return center; 

    if (decimal < 0.5f) { 

     final float distanceFromCenter = 0.5f - decimal; 
     final float distanceFromLeft = decimal + 0.5f; 

     final Vector3f leftColor = new Vector3f(left.getRed()/255f, left.getGreen()/255f, left.getBlue()/255f); 
     final Vector3f centerColor = new Vector3f(center.getRed()/255f, center.getGreen()/255f, center.getBlue()/255f); 

     leftColor.scale(1f - distanceFromLeft); 
     centerColor.scale(1f - distanceFromCenter); 

     final Vector3f color = Vector3f.add(leftColor, centerColor, null); 

     return new java.awt.Color(color.getX(), color.getY(), color.getZ()); 

    } else { 

     final float distanceFromCenter = decimal - 0.5f; 
     final float distanceFromRight = 1f - decimal + 0.5f; 

     final Vector3f rightColor = new Vector3f(right.getRed()/255f, right.getGreen()/255f, right.getBlue()/255f); 
     final Vector3f centerColor = new Vector3f(center.getRed()/255f, center.getGreen()/255f, center.getBlue()/255f); 

     rightColor.scale(1f - distanceFromRight); 
     centerColor.scale(1f - distanceFromCenter); 

     final Vector3f color = Vector3f.add(rightColor, centerColor, null); 

     return new java.awt.Color(color.getX(), color.getY(), color.getZ()); 

    } 

} 
+0

was interpolieren genau hier bedeuten? Stellen Sie hier einen Code zur Verfügung, was ist das Problem und was versuchen Sie zu erreichen? –

+0

so haben Sie Bild und Sie möchten ihre Farbe durch Pixel ändern? Mit gepufferten Bild? –

+0

Ich möchte die Pixelfarbe bekommen, die ** wäre ** da wäre, wenn das Bild gestreckt würde, aber ohne das Bild wirklich zu strecken. – ASasseCreations

Antwort

0

hoffe dieser Code hilft, wenn Sie dies entsprechend verwenden. Diese Funktion extrahiert Pixel aus gepufferten Bild und wir können es ersetzen, was immer wir wollen:

private BufferedImage changeColor(BufferedImage image, int srcColor, int replaceColor) 
{ 

    BufferedImage destImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g = destImage.createGraphics(); 
    g.drawImage(image, null, 0, 0); 
    g.dispose(); 


    for (int width = 0; width < image.getWidth(); width++) 
    { 
     for (int height = 0; height < image.getHeight(); height++) 
     { 

      if (destImage.getRGB(width, height) == srcColor) 
      { 
       destImage.setRGB(width, height, replaceColor); 
      } 

     } 
    } 

    return destImage; 
} 
+0

hast du das rauskommen oder was? Wenn es gemacht wird, ist dies beantwortet oder teilen Sie Ihren Code und Problem .. –

+0

Ich glaube, ich habe Sie verwirrt ... Ich möchte keine Farben ersetzen, ich möchte dies ein Pixel aus dem Bild mit bilinear Filterung – ASasseCreations

+0

Pixel sind tatsächliche Farben des Bildes. wenn Sie Pixel aus dem Bild entfernen wollen und es offensichtlich ist, dass das Bild die Farbe verlieren wird !! oder willst du nur die Pixel im Bild finden? –

Verwandte Themen