2016-12-30 36 views
0

我試圖實現一種在Java中採樣紋理的方法。我希望它能像使用GLSL的「紋理」功能一樣工作。我想要在計算顏色時將相鄰像素考慮在內。圖像上的像素之間的插值

例如,假設我使用浮點數來獲取特定像素處的圖像顏色,並且數字落在兩個像素之間。我如何計算相鄰像素的混合?這是顯示我的目標的圖像。

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

像素是圖像的實際顏色。如果你想從圖像中取出像素,很明顯圖像會失去顏色!或者你只是想找到圖像中使用的像素? –