Android 使用getPixel()方法,然后检查rgb值

Android 使用getPixel()方法,然后检查rgb值,android,colors,Android,Colors,我使用getPixel()方法返回位图中每个像素的rgb值。然后我使用if()语句将rgb值与我自己预定义的rgb值进行比较,如果该语句为true,则执行代码。如下所示: for(int x=startX; x<w; x++){ for(int y=startY; y<h; y++){ int pixel = img.getPixel(x, y); if(pixel == Color.rgb(2

我使用getPixel()方法返回位图中每个像素的rgb值。然后我使用if()语句将rgb值与我自己预定义的rgb值进行比较,如果该语句为true,则执行代码。如下所示:

for(int x=startX; x<w; x++){
            for(int y=startY; y<h; y++){
                int pixel = img.getPixel(x, y);

                if(pixel == Color.rgb(255, 255, 255)); //some code
                if(pixel == Color.rgb(255, 0, 0)); //some code
                if(pixel == Color.rgb(255, 255, 0)); //some code
                if(pixel == Color.rgb(120, 60, 0)); //some code
}

通过assets变量检索映像,assets变量是AssetManager类型的MainActivity类中的静态变量。我通过声明assets=getassets()初始化这个变量。我的图像位于AssetManager随后检索的资产文件夹中。

我在我的一个应用程序中也做了同样的操作,getPixel()工作得非常好。 我想问题在于使用Bitmap.Config.RGB_565时

在此格式中,每个像素的每个颜色通道(红色、绿色、蓝色)不包含1个字节(8位)。但它为红色提供5位(0-31),为绿色提供6位(0-63),为蓝色提供5位

因此,当您将像素从PNG放到RGB_565位图时,它们将从每个颜色通道的256个可能值缩放到红色和蓝色通道的32个值,以及绿色通道的64个值


请注意,此转换不是线性的。这意味着您不能将PNG中的红色值除以8,然后得到RGB_565的红色值。

我在我的一个应用程序中也做了同样的事情,getPixel()可以完美地工作。 我想问题在于使用Bitmap.Config.RGB_565时

在此格式中,每个像素的每个颜色通道(红色、绿色、蓝色)不包含1个字节(8位)。但它为红色提供5位(0-31),为绿色提供6位(0-63),为蓝色提供5位

因此,当您将像素从PNG放到RGB_565位图时,它们将从每个颜色通道的256个可能值缩放到红色和蓝色通道的32个值,以及绿色通道的64个值


请注意,此转换不是线性的。这意味着您不能将PNG中的红色值除以8,然后得到RGB_565的红色值。

如何创建和加载位图?它的颜色密度是多少?它存储的是什么类型的文件?当RGB_565可能永远不会有120、60个值时,哪一个是更好的选择?要么让位图始终为ARGB_8888,要么检查RGB组件是否不完全匹配,但如果必须的话,我将使用ARGB_8888,但出于内存原因,我想离开它。是否没有其他配置我可以使用?如果我没有设置默认配置,默认配置是什么?如何创建和加载位图?它的颜色密度是多少?它存储的是什么类型的文件?当RGB_565可能永远不会有120、60个值时,哪一个是更好的选择?要么让位图始终为ARGB_8888,要么检查RGB组件是否不完全匹配,但如果必须的话,我将使用ARGB_8888,但出于内存原因,我想离开它。是否没有其他配置我可以使用?如果我没有设置默认配置,默认配置是什么?
public static Bitmap loadBitmap(String filename, boolean transparency) {
        InputStream inputStream = null;
        try {
            inputStream = MainActivity.assets.open(filename);
        } catch (IOException e) {
            e.printStackTrace();
        }
        BitmapFactory.Options options = new BitmapFactory.Options();
        if (transparency) {
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        } else {
            options.inPreferredConfig = Bitmap.Config.RGB_565;
        }
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null,
                options);
        return bitmap;
    }