2016-12-30 5 views
0

Java에서 텍스처를 샘플링하는 방법을 구현하려고합니다. GLSL의 "텍스처"기능을 사용하는 것과 동일한 방식으로 작업하기를 원합니다. 색상을 계산할 때 주변 픽셀을 고려해야합니다.이미지의 픽셀 간 보간

예를 들어, 특정 픽셀에서 이미지 색상을 얻으려면 float를 사용하고 숫자는 두 픽셀 사이입니다. 주변 픽셀의 혼합을 어떻게 계산합니까? 내 목표를 보여주는 이미지가 있습니다.

enter image description here

enter image description here

자바의 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

나는 당신을 혼란스럽게 만들었다 고 생각합니다 ... 나는 어떤 색을 대체하고 싶지 않습니다, 나는 bilinear 필터링을 사용하여 이미지 밖으로 픽셀을 얻고 싶습니다. – ASasseCreations

+0

픽셀은 이미지의 실제 색상입니다. 이미지에서 픽셀을 빼내고 싶다면 이미지가 색상을 잃을 것입니다. 또는 이미지에 사용 된 픽셀을 찾고 싶습니까? –