【问题标题】:Read accurate colors of all pixel blocks of an image in android在android中读取图像所有像素块的准确颜色
【发布时间】:2018-01-17 07:29:42
【问题描述】:

我有一张图片,它的像素位于网格块中。每个像素占据一个网格的 20x20px 块。这是图片

我想读取该网格中每个块的颜色。这是我尝试过的代码。

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.abc);
    for(int y=0; y<bmp.getHeight(); y=y+20){
      for(int x=0; x<bmp.getWidth(); x=x+20){  
        pixelColor = bmp.getPixel(x,y);
    }
      }

现在的问题是,正在读取的颜色差异非常小,结果它选择了太多颜色。例如,在黑色的情况下,它会选择几乎 10 种彼此略有不同的黑色。请帮我挑选所有独特的颜色。任何帮助将非常感激。谢谢你

【问题讨论】:

    标签: java android android-studio bitmap rgb


    【解决方案1】:

    我终于通过在android中使用Palette类找到了自己

    我使用它的嵌套类 Palette.Swatch 来获取图像中的所有颜色样本。 我是这样做的

    ArrayList<Integer> color_vib = new ArrayList<Integer>();
    Bitmap bitmap = BitmapFactory.decodeResource( getResources(), R.drawable.abc );
    Palette.from( bitmap ).generate( new Palette.PaletteAsyncListener() {
      @Override
         public void onGenerated( Palette palette ) {
                //work with the palette here
                 for( Palette.Swatch swatch : palette.getSwatches() ) {
                        color_vib.add( swatch.getRgb() );
                    }
            }
        });
    

    现在我拥有任何块状像素化图像的所有独特颜色 :)

    【讨论】:

      【解决方案2】:

      这是设备密度的问题。您应该为不同密度的设备放置不同尺寸的图像。由于您的图像读取超过实际宽度和高度。这会导致问题使您的循环超载到超过实际像素。

      看看https://developer.android.com/guide/practices/screens_support.html#qualifiers 查看不同密度的设备以放置各种可绘制对象。如果您需要在 UI 中显示它,这将需要。

      否则,如果您不希望图像在 UI 中显示。将图像放入 drawable-nodpi 文件夹并获取高度,宽度它将返回正确的结果。

      请参阅此Question 并参考此Solution

      更新:

          ImageView imgTop = (ImageView) findViewById(R.id.imgTop);
          ImageView imgBtm = (ImageView) findViewById(R.id.imgBtm);
      
          Bitmap bmp1 = BitmapFactory.decodeResource(getResources(), R.drawable.pixel);
      
          Bitmap output = Bitmap.createBitmap(bmp1.getWidth(),bmp1.getHeight(), Bitmap.Config.ARGB_8888);
      
          int count = 0;
          int[] pixelColor = new int[bmp1.getHeight() * bmp1.getHeight()];
          for(int y=0; y<bmp1.getHeight(); y++){
              for(int x=0; x<bmp1.getWidth(); x++){
                 pixelColor[count] = bmp1.getPixel(x,y);
      
                  if(Color.red(pixelColor[count]) <= 30 && Color.green(pixelColor[count]) <= 30 && Color.blue(pixelColor[count]) <= 30)
                  {
                      pixelColor[count] = Color.BLACK;
                  }
                  else
                  {
                     //pixelColor[count] contain other colours..
                  }
                  output.setPixel(x,y,pixelColor[count]);
                  count++;
              }
          }
      
          imgTop.setImageBitmap(bmp1);
          imgBtm.setImageBitmap(output);
      

      输出

      【讨论】:

      • 感谢您的回答,非常感谢 :) 亲爱的问题不在于额外的像素,问题在于同一图像的额外颜色。例如,如果我只拍摄黑色图像,我的代码将显示很多黑色的颜色,并且在 RBG 值方面与其他颜色略有不同。我只想要黑色突出的颜色。
      • @TashenJazbi 您的颜色代码看起来像黑色像素略有不同,这是您使用不同颜色代码得到的结果。我检查了前 4 个对角线像素,即使它不同。
      • 是的,它是不同的,但黑色的所有细微变化都必须被解读为黑色。
      • 黑色的轻微变化不能读取为黑色,但我们可以自己读取每个像素并在接近黑色时更改为黑色。检查我更新的答案。
      • 谢谢兄弟,你的代码只能读取黑色,图片中还有其他颜色。可能有这样的颜色我们不能使用“Color.othercolor”条件,因为它们不存在于 Color 类中。
      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多