2014-12-02 2 views
0

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

public void changeBrightness(int brightness) 
{ 
     for(int i=0; i<height; i++) 
     { 
      for(int j=0; j<width; j++) 
      { 
       pixels[j][i] = MathUtils.ensureRange(pixels[j][i] + brightness,0,254); 
      } 
     } 
} 

Однако мне теперь нужно для создания метода changeContrast с почти такой же формой, и я хотел бы сделать эти операции подключаемыми с немного другой математикой, в которой установлены пиксели. Итак, я хотел бы создать общий метод с двойным циклом, который будет выполнять метод, который передается в качестве аргумента. Как мне это сделать в Java 7? Ниже приведен пример того, что я имею в виду:

public void runPixelOperation(***pixel operation method goes here***) 
    { 
     for(int i=0; i<height; i++) 
     { 
      for(int j=0; j<width; j++) 
      { 
       pixels[j][i] = ***run pixel operation here*** 
      } 
     } 
    } 
+0

Java 8 только? Или ранние версии тоже? – markspace

ответ

5

Почему бы не использовать интерфейс для этой проблемы, созданный для интерфейсов!

interface PixelLogic { 
    public int doOperation(); 
} 

class BlurLogic implements PixelLogic { 
    @Override 
    public int doOperation() { 
     return // some calculated value 
    } 
} 

class SomeClass { 

    public void runPixelOperation(PixelLogic logic) { 
     for(int i = 0; i < height; i++) { 
      for(int j = 0; j < width; j++) { 
       pixels[j][i] = logic.doOperation(); 
      } 
     } 
    } 

} 
0

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

1

Создайте интерфейс, скажем, PixelOperation, и объявить один метод. Этот метод может принимать одно значение, которое будет передаваться от pixels[j][j], когда оно будет вызвано.

Иметь runPixelOperation принять один параметр, экземпляр PixelOperation. Вызовите этот метод, пройдя pixels[j][i].

Когда вызывается runPixelOperation, вызывающий передаёт конкретный экземпляр PixelOperation в качестве подкласса, анонимного подкласса или выражения лямбда.

runPixelOperation((value) -> MathUtils.ensureRange(value + brightness,0,254)); 
Смежные вопросы