2015-11-09 2 views
-1

Назначение задает вопрос: «Переименуйте метод setLuminance как смесь и возьмите два изображения в качестве параметров: переднего плана и фона. Последовательность через пиксели переднего плана и фона одновременно (предположим, что они имеют точно такой же размер), изменяя яркость пикселей переднего плана. Вместо использования постоянной яркости TARGET, как в части A, используйте яркость соответствующего пикселя фонового изображения в качестве цели. Все остальное может оставаться неизменным ».Это значение, по-видимому, дает мне нуль?

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

и мой выход теперь составляет 90% ответа.

My output is

and this is the given answer

Я считаю, что я следил за каждым руководство, поэтому я могучий запутаться

public Luminance() { 
    Picture sunflower, earth; 
    sunflower = new Picture(); 
    earth = new Picture(); 
    display = new PictureDisplayer(sunflower); 
    display.waitForUser(); 
    blend(sunflower, earth); 
    display.close(); 
    System.exit(0); 
} 

private int getLuminance (Pixel p) { 
    int r; // red value of pixel 
    int g; // green value of pixel 
    int b; // blue value of pixel 
    int v; // average 
    r = p.getRed(); 
    g = p.getGreen(); 
    b = p.getBlue(); 
    v = sClip((r + g + b)/3); 
    return v; 
} 


private void blend(Picture sunflower, Picture earth) { 
    Pixel s,e; 
    int r; // red value of pixel 
    int g; // green value of pixel 
    int b; // blue value of pixel 

    while (sunflower.hasNext()) { 
     s = sunflower.next(); 
     e = earth.next(); 
     r = s.getRed(); 
     g = s.getGreen(); 
     b = s.getBlue(); 
     s.setRed(clip ((int) (r * (getLuminance(e))/getLuminance(s)))); 
     s.setGreen(clip ((int) (g * (getLuminance(e))/getLuminance(s)))); 
     s.setBlue(clip ((int) (b * (getLuminance(e))/getLuminance(s))));  
     } 
} 

private int clip(int val){ 
    if (val <=255){ 
     return val; 
    } 
    else { 
     return 255; 
    } 
} 
private int sClip (int val){ 
    if (val == 0){ 
     return 1; 
    } 
    else { 
     return val; 
    } 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) {Luminance r = new Luminance(); 
    // TODO code application logic here 

ответ

0

Я думаю, вы должны изменить:

s.setRed(clip ((int) (r *(getLuminance(e))/getLuminance(s)))); 

Например:

if(getLuminance(s)!=0){ 
    s.setRed(clip ((int) (r * (getLuminance(e))/getLuminance(s)))); 
} 
else{ 
    s.setRed(255); 
}