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);
4

1 回答 1

0

我有一个方法,但我认为它有点复杂。别担心我会在这里我会尽力为你说清楚=)

1:所以首先你必须创建一个 BufferedImage 对象

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

2:将 BufferedImage 转换为 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:现在你有一个整数一维数组,其中包含所有像素作为一个大的连接整数,如果你想单独操作颜色,那么你必须创建另外 4 个方法:getRed(int):int,getGreen(int):整数,getBlue(整数):整数。这三种方法为您提供每种颜色的渐变(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;

}

希望对你有所帮助,萨拉姆

于 2013-11-12T14:54:56.270 回答