2013-03-12 4 views
1

Я пытаюсь создать изображение, которое добавляет границу к существующему изображению на Java, копируя пиксели от их старых местоположений до новых координат. Мое решение работает, но мне было интересно, есть ли более эффективный/более короткий способ сделать это.Добавление границы в 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 пикселя (на каждом краю) в черном цвете.

Однако, если цель состоит в том, чтобы действительно перерисовать изображение, я подхожу к нему, захватывая каждый массив строк, а затем используя ByteBuffer и копируя в массиве строк (и пограничных элементах) операцию put(...), затем захватывает содержимое ByteBuffer в виде массива, чтобы снова вставить изображение.

Независимо от того, имеет ли значение разница в производительности, неизвестно, контрольная точка до и после этой попытки оптимизации, поскольку полученный код может быть на самом деле медленнее.

Основная проблема заключается в том, что, хотя функции системных массивов позволяют массовое копирование и заполнение содержимого массива, оно не предоставляет утилиту для этого в смещение по целевому массиву; однако Буферы из пакета NIO позволяют вам делать это довольно легко, поэтому, если решение существует, оно находится в NIO ByteBuffer или его родственнике.

Смежные вопросы