2012-04-30 3 views
2

이미지를 수평으로 뒤집는 ImageJ 용 Java-Plugin을 개발하고 싶습니다. 그러나 내 코드는 그림의 절반 만 넘깁니다. 어쩌면 이미지 복사본의 구성이나 출력에 문제가있을 수 있습니까?ImageJ-Plugin으로 이미지를 가로로 뒤집는 방법?

public class flipHorizontal implements PlugInFilter { 

public int setup (String arg, ImagePlus imp) 
{ 
    return DOES_ALL; 
} 

public void run (ImageProcessor ip) 
{ 
    int height=ip.getHeight(); 
    int width=ip.getWidth(); 

    ImageProcessor copy = ip; 


    for (int x=0; x<width; x++) { 

     for (int y=0; y<height; y++) { 
      int p=ip.getPixel(width-x-1,y); 
      copy.putPixel(x,y,p); 
     } 
    } 
    } 
} 
+0

btw SO에 오신 것을 환영합니다. 솔루션이 효과가있는 경우 upvote로 답변을 수락하십시오 (SO가 어떻게 처리되는지). – TacticalCoder

답변

0

논리가 잘못되었습니다. 당신이 얻는 것은 정상입니다. 이미지의 절반을 처리하지 않고 이미지의 절반이 수평으로 바뀌고 다른 절반이 두 번 건너 뛰는 것입니다 (실수하지 않은 경우). 그런 다음, 코드 샘플에서와 같이 직접 픽셀을 직접 조작하는 대신 로 이동하여 수평으로 뒤집기하려는 경우

어쨌든, 당신은 절반 폭 (폭/2)로 이동해야합니다.

그런 다음 실제로 "왼쪽"과 "오른쪽"

여기에 작동하는 수평 플립의에서 두 개의 픽셀을 반전 할 필요가

:

for (int x = 0; x < w/2; x++) { 
     for (int y = 0; y < h; y++) { 
      final int l = tmp.getRGB(w - (x + 1), y); 
      final int r = tmp.getRGB(x, y); 
      tmp.setRGB(x, y, l); 
      tmp.setRGB(w - (x + 1), y, r); 
     } 
    } 

"오프별로 한"오류가있을 수는 위의 코드에서 생각을해야합니다.

0

TacticalCoder 이미지의 절반 정도만 반복해야하며 다른 쪽에서 값을 덮어 쓰기 전에 저장해야합니다.

하지만, 만드는 가치가있을 수도 두 개의 추가 포인트가 있습니다 - 당신이 코드를 단순화 할 수 있도록 하나의 방법이 flipHorizontal 불렀다 이미하여 ImageProcessor class입니다 : 것

public class flipHorizontal implements PlugInFilter { 

    public int setup (String arg, ImagePlus imp) { 
     return DOES_ALL; 
    } 

    public void run (ImageProcessor ip) { 
     ip.flipHorizontal(); 
    } 
} 

다른 점은 가치 결정은 당신이이 라인의 의미를 오해하는 것 같다 것입니다 : 그냥 그렇게, ip와 같은 객체에 대한 다른 참조를 만드는 것

ImageProcessor copy = ip; 

:

copy.putPixel(x,y,p); 

... 그리고 :

ip.putPixel(x,y,p); 

는 ... 정확히 같은 효과가 있습니다. 동일한 픽셀 데이터를 나타내는 새로운 ImageProcessor를 만들려면 다음을 할 수 있습니다.

ImageProcessor copy = ip.duplicate(); 

그러나이 경우에는 필요하지 않습니다.

관련 문제