2016-12-30 12 views
0

Javaでテクスチャをサンプリングする方法を実装しようとしています。私はGLSLの "テクスチャ"機能を使用するのと同じように動作します。私は色が計算されるときに、隣接するピクセルを考慮に入れたい。イメージのピクセル間の補間

たとえば、あるピクセルでイメージの色を取得するにはfloatを使用し、その数は2ピクセルになります。どのようにして隣接するピクセルの組み合わせを計算できますか?ここに私の目標を示すイメージがあります。

enter image description here

enter image description here

この使用してJavaのBufferedImageのクラスを行う簡単な方法はありますか?

これまでのコードはここにありますが、現時点ではx位置のみで動作します。あなたが適切にこれを使用する場合

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

正確に補間する意味は?何が問題なのか、何を達成しようとしているのか、ここでいくつかのコードを提供してください。 –

+0

イメージを持っていて、バッファリングされたイメージを使用してピクセルを使って色を変更したいのですか? –

+0

画像が伸ばされても、画像を実際に伸ばさないで**そこにあるピクセルの色を得たいです。 – ASasseCreations

答えて

0

は、このコードのヘルプを願っています。この関数は、バッファリングされた画像からピクセルを抽出し、これまでのものを置き換えることができます。

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

あなたは出て来たのか何か?もしこれが答えられるか、あなたのコードと問題を分け合わせるのですか? –

+0

私はあなたを混乱させてしまったと思います...私は色を置き換えたくないので、バイリニアフィルタリングを使って画像からピクセルを取得します。 – ASasseCreations

+0

ピクセルは画像の実際の色です。画像からピクセルを取り除きたい場合は、画像が色を失うことが明らかです!またはあなたはちょうど画像で使用されるピクセルを見つける必要がありますか? –