我试图改变图像的亮度,对比度和其他值。我发现我在很多这些操作中都使用了经典的双循环,只是在双循环中运行了一些简单的数学运算,如下所示:
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方法,并且我希望这些操作可插入一些不同的数学,其中像素被设置。所以,我想用double for循环创建一个泛型方法,它将执行一个作为参数传递的方法。我将如何在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 :(得分: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();
}
}
}
}
答案 1 :(得分:1)
创建一个界面,比如PixelOperation
,然后声明一个方法。该方法可以采用pixels[j][j]
调用时提供的一个值。
让runPixelOperation
取一个参数,一个PixelOperation
的实例。调用该方法,传递pixels[j][i]
。
调用runPixelOperation
时,调用者将传递PixelOperation
的具体实例,作为子类,匿名子类或lambda表达式。
runPixelOperation( (value) -> MathUtils.ensureRange(value + brightness,0,254) );
答案 2 :(得分:0)
您没有提到您正在使用的Java版本,但这是Java lambdas的用途。