如何将灰度效果应用于位图图像?

时间:2014-04-14 07:04:45

标签: android c++ bitmap android-ndk grayscale

我想将位图图像转换为灰度图。因为我正在使用NDK来提升应用程序性能。我已成功应用其他效果。

问题::

我用来应用灰度的代码来自C ##。所以,我想把它转换成NDK。我无法做那部分..

作为参考,我正在编写如何将青色效果应用于图像的代码。

下面粘贴的代码工作正常。

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

适用于灰度效果的代码(取自网上的C ##示例)::

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

我想做什么::

我从here获取了这个项目,它对图像设置了不同的效果,但没有设置灰度。那么如何将灰度应用于代码,以便项目的所有其他功能都不会停止。

如果您需要我的任何信息,请告诉我。

非常感谢提前..

请帮我解决这个问题,因为我的项目无法进一步解决这个问题。

2 个答案:

答案 0 :(得分:2)

使用以下函数将位图转换为Android中的灰度等效值,而不是转换C#版本

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;
}

答案 1 :(得分:2)

我解决了问题::

这是我的解决方案......

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;
    }
}