Сепия Эффект изображения в Blackberry - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь применить эффект сепии к изображению в Blackberry. Я попробовал это, но не получил 100% эффект сепии. Это код, который я пробовал для эффекта сепии. Я использовал getARGB() и setARGB() методы растрового класса.

public Bitmap changetoSepiaEffect(Bitmap bitmap) {

    int sepiaIntensity=30;//value lies between 0-255.  30 works well

    // Play around with this. 20 works well and was recommended
    // by another developer. 0 produces black/white image
    int sepiaDepth = 20;

    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    // WritableRaster raster = img.getRaster();

    // We need 3 integers (for R,G,B color values) per pixel.
    int[] pixels = new int[w*h*3];
    // raster.getPixels(0, 0, w, h, pixels);

    bitmap.getARGB(pixels, 0, w, x, y, w, h);
    // Process 3 ints at a time for each pixel.
    // Each pixel has 3 RGB colors in array
    for (int i=0;i<pixels.length; i+=3) {
        int r = pixels[i];
        int g = pixels[i+1];
        int b = pixels[i+2];

        int gry = (r + g + b) / 3;
        r = g = b = gry;
        r = r + (sepiaDepth * 2);
        g = g + sepiaDepth;

        if (r>255) r=255;
        if (g>255) g=255;
        if (b>255) b=255;

        // Darken blue color to increase sepia effect
        b-= sepiaIntensity;

        // normalize if out of bounds
        if (b<0) {
            b=0;
        }
        if (b>255) {
            b=255;
        }

        pixels[i] = r;
        pixels[i+1]= g;
        pixels[i+2] = b;
    }
    //raster.setPixels(0, 0, w, h, pixels);
    bitmap.setARGB(pixels, 0, w, 0, 0, w, h);
    return bitmap;
}

1 Ответ

1 голос
/ 30 марта 2012

Звонок:

bitmap.getARGB(pixels, 0, w, x, y, w, h);

возвращает массив int [], где каждое целое представляет цвет в формате 0xAARRGGBB. Это отличается от предыдущего кода, использующего класс Raster в JavaSE.

РЕДАКТИРОВАТЬ: метод исправлен для BlackBerry:

    public static Bitmap changetoSepiaEffect(Bitmap bitmap) {

        int sepiaIntensity = 30;// value lies between 0-255. 30 works well

        // Play around with this. 20 works well and was recommended
        // by another developer. 0 produces black/white image
        int sepiaDepth = 20;

        int w = bitmap.getWidth();
        int h = bitmap.getHeight();

        // Unlike JavaSE's Raster, we need an int per pixel
        int[] pixels = new int[w * h];

        // We get the whole image
        bitmap.getARGB(pixels, 0, w, 0, 0, w, h);

        // Process each pixel component. A pixel comes in the format 0xAARRGGBB.
        for (int i = 0; i < pixels.length; i++) {
            int r = (pixels[i] >> 16) & 0xFF;
            int g = (pixels[i] >> 8) & 0xFF;
            int b = pixels[i] & 0xFF;

            int gry = (r + g + b) / 3;
            r = g = b = gry;
            r = r + (sepiaDepth * 2);
            g = g + sepiaDepth;

            if (r > 255)
                r = 255;
            if (g > 255)
                g = 255;
            if (b > 255)
                b = 255;

            // Darken blue color to increase sepia effect
            b -= sepiaIntensity;

            // normalize if out of bounds
            if (b < 0) {
                b = 0;
            }
            if (b > 255) {
                b = 255;
            }

            // Now we compose a new pixel with the modified channels,
            // and an alpha value of 0xFF (full opaque)
            pixels[i] = ((r << 16) & 0xFF0000) | ((g << 8) & 0x00FF00) | (b & 0xFF) | 0xFF000000;
        }

        // We return a new Bitmap. Trying to modify the one passed as parameter
        // could throw an exception, since in BlackBerry not all Bitmaps are modifiable.
        Bitmap ret = new Bitmap(w, h);
        ret.setARGB(pixels, 0, w, 0, 0, w, h);
        return ret;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...