AndroidLearner
AndroidLearner

Reputation: 4636

How to apply the grayscale effect to the Bitmap image?

I want to convert the bitmap image into the Grayscale.For that i am using the NDK to boost the app performance.I have apply the other effect successfully.

Problem ::

The code which i am using to apply the grayscale is taken from the C##.So,i want to convert it into the NDK.I am unable to do that part ..

For reference, i am putting the code of how i have applied the cyan effect to image.

Below pasted code is working fine.

void applyCyano(Bitmap* bitmap) {
    //Cache to local variables
    unsigned char* red = (*bitmap).red;
    unsigned char* green = (*bitmap).green;
    unsigned char* blue = (*bitmap).blue;

    unsigned int length = (*bitmap).width * (*bitmap).height;
    register unsigned int i;
    register unsigned char grey, r, g, b;
    for (i = length; i--;) {
        grey = ((red[i] * 0.222f) + (green[i] * 0.222f) + (blue[i] * 0.222f));
        r = componentCeiling(61.0f + grey);
        g = componentCeiling(87.0f + grey);
        b = componentCeiling(136.0f + grey);

        grey = blackAndWhite(red[i], green[i], blue[i]);
        red[i] = overlayPixelComponents(grey, r, 0.9f);
        green[i] = overlayPixelComponents(grey, g, 0.9f);
        blue[i] = overlayPixelComponents(grey, b, 0.9f);
    }
}

The code to appply Grayscale effect(taken from C## example over the net) ::

void applyGrayscaleNatively(Bitmap* original)
{
    //create an empty bitmap the same size as original
    Bitmap newBitmap = new Bitmap(original.Width, original.Height);

    //lock the original bitmap in memory
    BitmapData originalData = original.LockBits(
            new Rectangle(0, 0, original.Width, original.Height),
            ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);

    //lock the new bitmap in memory
    BitmapData newData = newBitmap.LockBits(
            new Rectangle(0, 0, original.Width, original.Height),
            ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);

    //set the number of bytes per pixel
    int pixelSize = 3;

    for (int y = 0; y < original.Height; y++)
    {
        //get the data from the original image
        byte* oRow = (byte*)originalData.Scan0 + (y * originalData.Stride);

        //get the data from the new image
        byte* nRow = (byte*)newData.Scan0 + (y * newData.Stride);

        for (int x = 0; x < original.Width; x++)
        {
            //create the grayscale version
            byte grayScale =
                    (byte)((oRow[x * pixelSize] * .11) + //B
                            (oRow[x * pixelSize + 1] * .59) +  //G
                            (oRow[x * pixelSize + 2] * .3)); //R

            //set the new image's pixel to the grayscale version
            nRow[x * pixelSize] = grayScale; //B
            nRow[x * pixelSize + 1] = grayScale; //G
            nRow[x * pixelSize + 2] = grayScale; //R
        }
    }

    //unlock the bitmaps
    newBitmap.UnlockBits(newData);
    original.UnlockBits(originalData);
}

What i want to do ::

I have taken this project from the here which have set the different effect to the image but not the grayscale.so how to apply the grayscale to the code so that all the other funcationality of the project won't stop.

Let me know if you need anything from me .

Many Thanks in Advance..

Please help me to resovle this issue as just because of this am not able to go further in my project.

Upvotes: 1

Views: 1357

Answers (2)

AndroidLearner
AndroidLearner

Reputation: 4636

I solved the issue ::

Here is my solution ...

void applyGrayscaleNatively(Bitmap* bitmap)
{
    register unsigned int i;
    unsigned int length = (*bitmap).width * (*bitmap).height;
    register unsigned char grey;
    unsigned char* red = (*bitmap).red;
    unsigned char* green = (*bitmap).green;
    unsigned char* blue = (*bitmap).blue;

    float matrix[4][4];
    identMatrix(matrix);
    float saturation = 1.0f;
    saturateMatrix(matrix, &saturation);
    applyMatrix(bitmap, matrix);

    for (i = length; i--;) {

        float value;
        getBrightness(red[i], green[i], blue[i], &value);

        grey = grayScale(red[i], green[i], blue[i]);

        red[i] = grey;
        green[i] = grey;
        blue[i] = grey;
    }
}

Upvotes: 2

Khawar Ali
Khawar Ali

Reputation: 3506

Use the following function to convert bitmap to its grayscale equivalent in Android instead of converting the C# version

public Bitmap toGrayscale(Bitmap bmpOriginal){        

int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();    

Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}

Upvotes: 2

Related Questions