【问题标题】:Explanation of the method getPixels for a Bitmap in AndroidAndroid中Bitmap的getPixels方法说明
【发布时间】:2011-05-09 13:04:45
【问题描述】:

如何解释位图的内置方法 getPixels 返回的数组?

这是我的代码:

public void foo() {
    int[] pixels;
    Bitmap bitmapFoo = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.test2);             
    int height = bitmapFoo.getHeight();
    int width = bitmapFoo.getWidth();

    pixels = new int[height * width];

    bitmapFoo.getPixels(pixels, 0, width, 1, 1, width - 1, height - 1);     
}

返回的数组“pixels”的值从 -988,602,635 到 1,242,635,509,这只是我制作的一个简单 PNG 文件中的几种颜色。如何解释从该方法返回的数字?

编辑:我意识到这个整数代表一种颜色。我只是不明白如何将这个单个整数解释为构成颜色的 RBG 和 alpha 值。

谢谢。

PS。如果你问自己,“他想做什么?”我正在尝试找出一种动态修改位图颜色的方法。

【问题讨论】:

  • 你对 getPixels 的简单参数救了我...

标签: java android colors bitmap


【解决方案1】:

它为Color class.返回一个int

Color 类定义了用于 创建和转换颜色整数。 颜色表示为packed ints, 由 4 个字节组成:alpha、red、green、 蓝色。这些值是未预乘的, 意味着存储任何透明度 仅在 alpha 分量中,而不是 在颜色成分中。这 组件存储如下 (阿尔法 。每个组件范围 在 0..255 之间,0 表示没有 该组件的贡献,以及 255 表示 100% 的贡献。因此 opaque-black 将是 0xFF000000 (100% 不透明但没有来自红色的贡献, gree、blue 和 opaque-white 将是 0xFFFFFFFF

例如,当您使用 Paint 对象时:

Paint pRed = new Paint();
pRed.setColor(Color.RED);

setColor 需要一个 int。 Color.RED 是其预定义的“红色”含义的 int 值。

【讨论】:

  • 嘿,谢谢,但我知道这是一种颜色。我应该更好地表达我的问题,问我真正想要什么。那是我的错,它已被编辑。 +1。
  • @user432209 查看我引用的部分。 (阿尔法
  • 这是我没有得到的部分。 (阿尔法
  • 这是位逻辑,其中 en.wikipedia.org/wiki/Bitwise_operation
  • 每个像素是 RGB32 像素中的 8 位。将红色、绿色、蓝色和现在的 alpha 打包成一个 32 位数据整数是很常见的。
【解决方案2】:

如果您有 alpha、red、green 和 blue 值,则您的颜色等于 (alpha

要从 int 中检索 alpha、red、green 和 blue 值,比如 argb:

int alpha=argb>>24;
int red=(argb-alpha)>>16;
int green=(argb-(alpha+red))>>8;
int blue=(argb-(alpha+red+green));

【讨论】:

    【解决方案3】:

    更多:

    int alpha=argb>>24;
    int red=(argb & 0x00FF0000)>>16;
    int green=(argb & 0x0000FF00)>>8;
    int blue=(argb & 0x000000FF);
    

    【讨论】:

      【解决方案4】:

      您还可以执行以下操作从 一个整数:

      int mColor = 0xffffffff;
      
      int alpha = Color.alpha(mColor);
      int red = Color.red(mColor);
      int green = Color.green(mColor);
      int blue = Color.blue(mColor);
      

      【讨论】:

        【解决方案5】:

        除此之外,我认为应该是

        bitmapFoo.getPixels(pixels, 0, width, 0, 0, width, height); 
        

        坐标是从0开始的吧?

        【讨论】:

        • 根据getPixels 的文档,步幅必须 >= 位图的宽度。您在此处使用“0”表示步幅。
        • 第三个参数是stride,在例子中等于width。参数列表如下:int[] pixels, int offset, int stride, int x, int y, int width, int height
        猜你喜欢
        • 2012-11-06
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2013-11-10
        相关资源
        最近更新 更多