【问题标题】:Android Bitmap setPixel doens't work correctly? (set value, then read a different value)Android 位图 setPixel 无法正常工作? (设置值,然后读取不同的值)
【发布时间】:2011-10-22 14:01:25
【问题描述】:

我使用 setPixel() 将像素设置为某个值,但是当我在同一像素上调用 getPixel 时,它会返回一个不同的值。

当 alpha==255 时它工作正常,但任何其他值它给出不同的值;

这是在华硕变压器 Honeycomb 3.2 上测试的

int newPixel=Color.argb(alpha, red, green, blue);
if(x==74&&y==86){
    Log.w("PuzzleMaker","newPixel:"+newPixel+","+image.getConfig().name()+","+image.isMutable());
}
image.setPixel(x,y,newPixel);
if(x==74&&y==86){
    int testPixel=image.getPixel(x, y);
    Log.w("PuzzleMaker","testPixel:"+testPixel);
}

日志:

newPixel: 13426418,ARGB_8888,true
testPixel: -16777216

日志中的2个数字应该相同。

【问题讨论】:

  • 太好了,我很高兴你知道了!既然您自己想通了,您应该将解决方案添加为该问题的答案,然后将您的答案视为正确答案。
  • 我本来打算这样做,但由于我是新手,所以在我提出问题至少 8 小时后才能添加自己的答案。不过我现在会这样做。

标签: android bitmap pixel


【解决方案1】:

我认为这与 Android 处理位图的方式中的一些怪癖有关。

根据您的日志输出,您似乎将像素设置为0x00ccdef2(如果我没记错的话,这是完全透明的)。当您检索像素时,您会得到-16777216,如果您查看 Color 类的文档,它就是常量 Color.BLACK。基本上,Android似乎没有保存图像的透明度。所以当你给它一个完全透明的颜色时,它只是把它当作黑色。

有一些关于类似问题here的讨论,还有一个旧的错误报告here

【讨论】:

    【解决方案2】:

    原来有一个非常简单的解决方案。我发现 setPixel() 方法是将红色、绿色和蓝色值乘以 alpha,然后只设置 r,g,b。

    只需调用 image.setHasAlpha(true) 即可解决此问题,因此它会设置所有 4 个值。

    【讨论】:

    • 但这需要 API 级别 12。如果我有 API 级别 8 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2011-07-07
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多