android - 验证 Android 位图是 GrayScale

标签 android image-processing bitmap grayscale

我有疑问。当我从 Android 中的 Bitmap 获取像素时。我在里面加载了一张图片,这张图片是灰度图。如果我创建一个 getPixels() 并检查值,我可以看到 R != G != B 的值。

如果三张幻灯片(R、G 和 B)的值相同,我想我可以检查它是否为灰度,但我不可能。 有办法验证吗?

非常感谢!

最佳答案

首先让我们说有几种方法可以实现这一点。

我会说使用(类似的东西)获取图像的大小

int myHeight = myImage.getHeight();
int myWidth  = myImage.getWidth();

我会说在这种情况下您可能还想验证位图的配置,因为它可能是 3 种不同格式之一

ALPHA_8, ARGB_8888, or RGB_565

您可以使用

获取配置
myImage.getConfig()

例行公事。稍后我们将讨论如何使用它。

既然您知道图像的大小,您应该按如下方式运行双循环结构:

boolean isGrayscaleImage = true;  // assume it is grayscale until proven otherwise

for(int i = 0; i < myWidth; i++){
    for(int j = 0; j < myHeight; j++){
        int currPixel = myImage.getPixel(i, j);

        if( false == isGrayScalePixel(currPixel) ){
            isGrayscaleImage = false;
            break;
        }
    }
}

返回如何测试像素是否为灰度: 如果图像存储为 ALPHA_8 它实际上不是灰度图像,但它可以通过将图像转换为 ARGB_8888 图像并将 Alpha 值设置为 0xFF 以及每个 R、G 和 B 分量从技术上转换为灰度图像到基于原始 8 位 ALPHA_8 的图像中提供的 alpha 值。

如果图像是 RGB_565 格式,这会有点棘手,因为您必须自己使用 shift 和 MASKING 运算符将 R、G 和 B 值分离到它们自己的字节中。完成此操作后,它基本上就像处理 ARGB_8888 图像(在下面讨论)。

对于 ARGB_8888 图像: alpha channel 应该总是 0xFF。

正如您在问题中所述,如果 R == G == B,则像素被视为灰度 SO(示例代码可能如下所示)

boolean isGrayScalePixel(int pixel){
    int alpha = (pixel && 0xFF000000) >> 24;
    int red   = (pixel && 0x00FF0000) >> 16;
    int green = (pixel && 0x0000FF00) >> 8;
    int blue  = (pixel && 0x000000FF);

    if( 0 == alpha && red == green && green == blue ) return true;
    else return false;

}

可以进行优化,但我正在尝试为您记录主要算法。

希望这对您有所帮助:-)

关于android - 验证 Android 位图是 GrayScale,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10957348/

相关文章:

android - 跟踪推送通知并记录它们

Java 到 Smali 指令转换器

image-processing - LoG(高斯拉普拉斯)滤波器、一阶和二阶导数高斯滤波器有什么区别?

Python 属性错误 : 'module' object has no attribute 'DIST_L2'

c++ - 如何将 gdi+ 类位图结构转换为 HDC?

android - Android单元测试中资源文件访问 "InvocationTargetException"

java - Android 应用程序在 setText 上崩溃

algorithm - 如何优化图像的翻转、反转和旋转?

java - 安卓 : Bitmap gets saved as black picture

安卓 : Bitmap : How to save canvas with green background in android?