Android为Bitmap添加微妙的噪音

时间:2014-10-28 19:57:13

标签: android image-processing bitmap

任何人都知道如何为灰度图像添加微妙的噪点? 我有一个灰度图像,我想添加一些微妙的黑色和白色噪音。有谁知道怎么做?

我目前正在使用此方法,但这只是生成随机颜色并使用这些颜色交换现有像素。如何在位图上仅为某些像素添加一些细微的黑白噪声?

public static Bitmap applyFleaEffect(Bitmap source) {
// get source image size
 int width = source.getWidth();
  int height = source.getHeight();
 int[] pixels = new int[width * height];
 // get pixel array from source
 source.getPixels(pixels, 0, width, 0, 0, width, height);
 // create a random object
 Random random = new Random();

int index = 0;
// iteration through pixels
for(int y = 0; y < height; ++y) {
for(int x = 0; x < width; ++x) {
// get current index in 2D-matrix
index = y * width + x;
// get random color
int randColor = Color.rgb(random.nextInt(255),
  random.nextInt(255), random.nextInt(255));
// OR
pixels[index] |= randColor;

}   }       //输出位图       位图bmOut = Bitmap.createBitmap(width,height,source.getConfig());       bmOut.setPixels(像素,0,宽度,0,0,宽度,高度);       返回bmOut;       }       }

更新:添加完整代码以显示灰度步骤和尝试噪声步骤

      //First, apply greyscale to make Image black and white
    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, mBitmap.getConfig());
    Canvas c = new Canvas(bmpGrayscale);
    Paint paint = new Paint();
    ColorMatrix cm = new ColorMatrix();
    cm.setSaturation(0);
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
    paint.setColorFilter(f);

    //Apply noise after grayscale
    int[] pixels = new int[width * height];

    bmpGrayscale.getPixels(pixels, 0, width, 0, 0, width, height);
    // a random object
    Random random = new Random();

    int index = 0;

    // Note: Declare the c and randColor variables outside of the for loops
    int co = 0;
    int randColor = 0;
    // iteration through pixels
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            if (random.nextInt(101) < percentNoise) {
                // Skip this iteration a certain percentage of the time
                continue;
            }
            // get current index in 2D-matrix
            index = y * width + x;


            co = random.nextInt(255);


            randColor = Color.rgb(co, co, co);
            pixels[index] |= randColor;




        }
    }
    // output bitmap
    mBitmap = Bitmap.createBitmap(width, height, bmpGrayscale.getConfig());
    mBitmap.setPixels(pixels, 0, width, 0, 0, width, height);

    c.drawBitmap(mBitmap, 0, 0, paint);
    return bmpGrayscale;
}

1 个答案:

答案 0 :(得分:1)

首先,randColor不太可能是您的代码的灰度颜色。要生成随机的灰度颜色:

int c = random.nextInt(255);
int randColor = Color.rgb(c, c, c);

考虑到这一点,我将重新编写您的代码(注意:根据您的喜好调整percentNoise参数):

public static Bitmap applyFleaEffect(Bitmap source, int percentNoise) {
    // get source image size
    int width = source.getWidth();
    int height = source.getHeight();
    int[] pixels = new int[width * height];
    // get pixel array from source
    source.getPixels(pixels, 0, width, 0, 0, width, height);
    // create a random object
    Random random = new Random();

    int index = 0;
    // Note: Declare the c and randColor variables outside of the for loops
    int c = 0;
    int randColor = 0;
    // iterate through pixels
    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; ++x) {
            if (random.nextInt(101) < percentNoise) {
                // Skip this iteration a certain percentage of the time
                continue;
            }
            // get current index in 2D-matrix
            index = y * width + x;
            // get random color
            c = random.nextInt(255);
            randColor = Color.rgb(c, c, c);
            pixels[index] |= randColor;
        }
    }
    Bitmap bmOut = Bitmap.createBitmap(width, height, source.getConfig());
    bmOut.setPixels(pixels, 0, width, 0, 0, width, height);
    return bmOut;
}