我有一个位图,我想遍历每个像素并添加一个简单的模糊效果,我只想要取当前像素的平均值,它是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 :(得分: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;
}
我希望能帮到你,萨拉姆