2013-03-03 3 views
-1

Как вы можете видеть, я пытаюсь написать метод pixelate для буферизованного изображения. Я отлаживал все методы внутри этого, который я вызываю, splitARGB работает правильно, а также combARGB. У меня есть глобальные переменные для хранения значений splitARGB (alpha, reds, greens, blues). Моя проблема заключается в том, что при прохождении внутренних контуров она постоянно получает одно и то же значение aRGB (сначала они разные, но в итоге они просто начинают выплевывать одно и то же значение), а затем, когда я проверяю изображение после его завершения, оно имеет 0 изменений.BufferedImage for loop to pixelate

У меня есть несколько других методов, которые отлично работают, и они называют те же методы (splitARGB, combARGB), и они отлично работают, поэтому я делаю что-то неправильно с этим. Вся помощь была оценена.

public static BufferedImage pixelate(BufferedImage imgt) { 
    //vars 
    int tempARGB = 0; 
    int avgAlpha = 0; 
    int avgRed = 0; 
    int avgGreen = 0; 
    int avgBlue = 0; 
    int interval = 70; 

    //every 2 Y pixels, iterate through the X line 
    for (int y = 0; y < (imgt.getHeight() - interval); y = y + interval) { 
     for (int x = 0; x < (imgt.getWidth() - interval); x = x + interval) { 

      //interior pixel group loop 
      for (int yloop = 0; yloop < interval; yloop++) { 
       for (int xloop = 0; xloop < interval; xloop++) { 

        tempARGB = imgt.getRGB(yloop, xloop); 
        //System.out.println("XLOOP VAL:" + xloop); 
        //System.out.println("YLOOP VAL:" + yloop); 
        //System.out.println("TEMPARGB:" + tempARGB); 
        splitARGB(tempARGB); 
        avgAlpha = avgAlpha + alpha; 
        avgRed = avgRed + reds; 
        avgGreen = avgGreen + greens; 
        avgBlue = avgBlue + blues; 
       } 
      } 
      //Average the values 
      avgAlpha = avgAlpha/interval; 
      avgRed = avgRed/interval; 
      avgGreen = avgGreen/interval; 
      avgBlue = avgBlue/interval; 
      combineARGB(avgAlpha, avgRed, avgGreen, avgBlue); 
      System.out.println("New RGB:" + newRGB); 

      //loop again to assign the values 
      for (int yloop2 = 0; yloop2 < interval; yloop2++) { 
       for (int xloop2 = 0; xloop2 < interval; xloop2++) { 
        imgt.setRGB(xloop2, yloop2, newRGB); 
       } 
      } 
     } 
    } 
    return imgt; 
} 
+1

Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

Если возможно, я рекомендую вам «расширять» BufferedImage; создавая функцию для пикселизации, изображение кажется функциональным, а не объектно-ориентированным, программированием. –

ответ

0

кажется, что одна проблема может быть, что в вашем внутреннем цикле, вы следите тот же values-- то есть, каждый раз, когда вы запускаете этот цикл вы, начиная с 0, так как вы назначили yloop и xloop к 0 в объявление цикла. Таким образом, каждый раз, когда вы вводите этот цикл, вы просто будете проверять значения от 0 до интервала. То же самое, когда вы устанавливаете значения. Вы должны назначить эти значения за пределами всех циклов, таким образом, вы можете сохранить свой индекс (x, y) на изображении вместо повторения по той же группе.