如何从Android设备上的位图获取RGB值?
image
image-processing
7
0

我想在android中获取位图的RGB值,但到目前为止我做不到。我的目标是为位图的每个像素获取RGB值。有针对Android或其他功能的任何特定功能吗?我也想知道我是否需要colorMatrix()函数?这对我的项目非常重要。谢谢

参考资料:
Stack Overflow
收藏
评论
共 5 个回答
高赞 时间 活跃

这就是我试图获得该价值的方式。使用bitmap.getPixel()获取整数数组中的相应位图。通过使用按位旋转操作,我们将获得RGB值。

             int[] pix = new int[picw * pich];
             bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);

             int R, G, B,Y;

             for (int y = 0; y < pich; y++){
             for (int x = 0; x < picw; x++)
                 {
                 int index = y * picw + x;
                 int R = (pix[index] >> 16) & 0xff;     //bitwise shifting
                 int G = (pix[index] >> 8) & 0xff;
                 int B = pix[index] & 0xff;

                 //R,G.B - Red, Green, Blue
                  //to restore the values after RGB modification, use 
 //next statement
                 pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
                 }}
收藏
评论

这可能会有点晚了,但是要使用&0xff消除混乱:

在Java中,int是32位,因此每个像素的(A)RGB值打包在4个字节中。换句话说,在ARGB_8888模型中,值为R(123),G(93),B(49)= FF7B 5D31的像素。其中Alpha = FF,R = 7B,G = 5D,B =31。但这被存储为-8692431的整数。

因此,要从-8692431提取Green值,我们需要将5D右移8位,如您所知。这得到00FF 7B5D。因此,如果我们仅采用该值,我们将剩下16743261作为我们的绿色值。因此,我们按位进行运算,且该值的掩码为0xFF(相当于0000 00FF),将导致00FF 7B5D被“掩码”为0000 005D。因此,我们提取了绿色值5D(或93十进制)。

我们可以为每个提取使用0xFF的相同掩码,因为所有值都已移位以将所需的两个字节显示为最低有效值。因此,先前建议的代码为:

int p = pixel[index];

int R = (p >> 16) & 0xff;
int G = (p >> 8) & 0xff;
int B = p & 0xff;

如果更清楚,则可以执行以下等效操作:

int R = (p & 0xff0000) >> 16;
int G = (p & 0x00ff00) >> 8;
int B = (p & 0x0000ff) >> 0;

为简便起见,可以删除多余的0,并将其写为

int R = (p & 0xff0000) >> 16;
int G = (p & 0xff00) >> 8;
int B = p & 0xff;

但是请注意,可以使用其他颜色模型,例如RGB_555,它将每个像素存储为2个字节,并且RGB通道的精度有所不同。因此,在执行提取之前,应检查位图使用的模型,因为颜色的存储方式可能不同。

收藏
评论

Bitmap.getPixel(x, y)返回一个int,其中嵌入了颜色值和alpha值。

int colour = bitmap.getPixel(x, y);

int red = Color.red(colour);
int blue = Color.blue(colour);
int green = Color.green(colour);
int alpha = Color.alpha(colour);
收藏
评论

任意位图颜色处理

您可以在此处阅读各种Color方法,这些方法将从一个像素int中提取颜色的成分。

您可能要对位图应用过滤器,然后返回一个字节数组。否则,您可以将本示例简化为for循环,然后遍历生成字节数组的像素。

private byte[] rgbValuesFromBitmap(Bitmap bitmap)
{
    ColorMatrix colorMatrix = new ColorMatrix();
    ColorFilter colorFilter = new ColorMatrixColorFilter(
            colorMatrix);
    Bitmap argbBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(argbBitmap);

    Paint paint = new Paint();

    paint.setColorFilter(colorFilter);
    canvas.drawBitmap(bitmap, 0, 0, paint);

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int componentsPerPixel = 3;
    int totalPixels = width * height;
    int totalBytes = totalPixels * componentsPerPixel;

    byte[] rgbValues = new byte[totalBytes];
    @ColorInt int[] argbPixels = new int[totalPixels];
    argbBitmap.getPixels(argbPixels, 0, width, 0, 0, width, height);
    for (int i = 0; i < totalPixels; i++) {
        @ColorInt int argbPixel = argbPixels[i];
        int red = Color.red(argbPixel);
        int green = Color.green(argbPixel);
        int blue = Color.blue(argbPixel);
        rgbValues[i * componentsPerPixel + 0] = (byte) red;
        rgbValues[i * componentsPerPixel + 1] = (byte) green;
        rgbValues[i * componentsPerPixel + 2] = (byte) blue;
    }

    return rgbValues;
}
收藏
评论

一个少声明:D

imagen.getPixels(pix, 0, picw, 0, 0, picw, pich);

    for (i = 0; i < pix.length; i++) {
        r = (pix[i]) >> 16 & 0xff;
        g = (pix[i]) >> 8 & 0xff;
        b = (pix[i]) & 0xff;
    }
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号