2013-03-12 5 views
1

이전 위치의 픽셀을 새 좌표로 복사하여 Java의 기존 이미지에 테두리를 추가하는 이미지를 만들려고합니다. 내 솔루션이 작동하지만, 더 효율적인/짧은 방법이 있는지 궁금 해서요.자바에서 테두리 추가

/** Create a new image by adding a border to a specified image. 
* 
* @param p 
* @param borderWidth number of pixels in the border 
* @param borderColor color of the border. 
* @return 
*/ 
    public static NewPic border(NewPic p, int borderWidth, Pixel borderColor) { 
    int w = p.getWidth() + (2 * borderWidth); // new width 
    int h = p.getHeight() + (2 * borderWidth); // new height 

    Pixel[][] src = p.getBitmap(); 
    Pixel[][] tgt = new Pixel[w][h]; 

    for (int x = 0; x < w; x++) { 
     for (int y = 0; y < h; y++) { 
      if (x < borderWidth || x >= (w - borderWidth) || 
       y < borderWidth || y >= (h - borderWidth)) 
        tgt[x][y] = borderColor; 
      else 
       tgt[x][y] = src[x - borderWidth][y - borderWidth]; 

     } 
    } 

    return new NewPic(tgt); 
    } 

답변

2

그것은 단지 화면에 프리젠 테이션을 위해, 그리고 의도가 실제로 이미지에 테두리를 추가 할 수 있지만, 테두리, the component that is displaying your image can be configured with a border으로 화면에 존재하는 이미지를 가지고 있지 않은 경우.

component.setBorder(BorderFactory.createMatteBorder(
           4, 4, 4, 4, Color.BLACK)); 

블랙 그려진 테두리 (각 모서리) 4 화소를 제공한다.

그러나 실제로 이미지를 다시 그리는 것이 목적이라면 각 행 배열을 잡아서 ByicleBuffer를 사용하고 행 배열 (및 테두리 요소)을 대량으로 put(...) 작업으로 복사하여 접근합니다. ByteBuffer 전체 내용을 배열로 가져 와서 이미지에 다시 채워 넣습니다.

성능에 차이가 있는지 여부는 알 수 없으므로 결과 코드가 실제로 느려질 수 있으므로 최적화 전과 후의 벤치 마크는 최적화를 시도합니다.

주요 문제는 시스템 배열 기능을 사용하여 배열 내용을 대량 복사하고 채울 수 있지만 대상 배열의 오프셋에 유틸리티를 제공하지 않는다는 것입니다. 그러나 NIO 패키지의 버퍼를 사용하면 매우 쉽게 할 수 있으므로 솔루션이있는 경우 NIO ByteBuffer 또는 그 친족에 있습니다.