2013-11-12 5 views
0

У меня есть растровое изображение, которое я хочу пропустить через каждый пиксель и добавить простой эффект размытия, я просто хочу, чтобы взять среднее значение текущего пикселя, а это 4/8 соседей. Я видел несколько примеров, но большинство из них довольно продвинутые, и я ищу что-то очень простое.Зацикливание через пиксели в растровом изображении и добавление простого размытия

То, что я до сих пор:

int height = mPhoto.getHeight(); 
int width = mPhoto.getWidth(); 

int[] pixels = new int[height*width]; 
mPhoto.getPixels(pixels, 0, 0, 0, 0, height, width); 
+0

Вы просто пытались сокращениями затем Upsizing изображения для получения эффекта размытия? Если не плохой пост, введите код. – Broak

+0

У меня есть, и это работает отлично, но я хочу попробовать сделать несколько разных фильтров изображений, и первый шаг, похоже, состоит в том, чтобы узнать/понять, как сделать простой размытие таким образом. – Jacco

ответ

0

У меня есть метод, но я думаю, что это имеет немного сложности. Не волнуйтесь, я буду здесь, я постараюсь сделать это ясно для вас =)

1: Итак, в первую очередь вы должны создать объект BufferedImage

BufferedImage theImage = ImageIO.read(new File("pathOfTheImage.extension")); 

2: Преобразование BuferedImage в массив int. Вы должны создать метод, чтобы сделать это для вас

public static int[] rasterize(BufferedImage img) { 
     int[] pixels = new int[img.getWidth() * img.getHeight()]; 
     PixelGrabber grabber = new PixelGrabber(img, 0, 0, img.getWidth(), 
       img.getHeight(), pixels, 0, img.getWidth()); 
     try { 
      grabber.grabPixels(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return pixels; 
    } 

3: теперь у вас есть целое 1D массив, который содержит все пиксели как большое каскадное целое число, если вы хотите, чтобы манипулировать цвета отдельно, то вы должны создать еще 4 метода: getRed (int): int, getGreen (int): int, getBlue (int): int. эти три метода дают вам градиент каждого цвета (0 ~ 255). Последний метод makeRGB (int, int, int): int. Этот метод создает пиксели из компонента цветов RGB. Это ядро ​​каждого метода ^^:

public static int getRed(int RGB) { 
    return (RGB >> 16) & 0xff; 
} 

public static int getGreen(int RGB) { 
    return (RGB >> 8) & 0xff; 
} 

public static int getBlue(int RGB) { 
    return RGB & 0xff; 
} 
public static int makeRGB(int red, int green, int blue) { 
    return ((red << 16) & 0xff) + ((green << 8) & 0xff) + (blue & 0xff); 
} 

4: Последнее, что нужно говорить о том, как превратить Int массив в BufferedImage снова. Это код, чтобы сделать это;)

public static BufferedImage arrayToBufferedImage(int[] array, int w, int h) { 

    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
    WritableRaster raster = (WritableRaster) image.getData(); 
    raster.setPixel(0, 0, array); 

    return image; 

} 

Я надеюсь, что поможет вам, Сала

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