【问题标题】:getPixel returns a negative value in AndroidgetPixel 在 Android 中返回负值
【发布时间】:2014-03-06 16:13:30
【问题描述】:

朋友们,我是 android 新手,正在处理一个我想要一些图像处理的项目。当我尝试使用

int pixels=myImageBitmap.getPixel(x,y);

我得到的只是 x 中的一些负值 此外,我正在尝试使用

为该像素设置一些值
result.setPixel(x,y,pixels);

我的应用程序突然停止,之后,我的日志猫看起来像

03-06 19:52:01.731: W/dalvikvm(29185): threadid=1: thread exiting with uncaught exception (group=0x41036378)
03-06 19:52:01.731: E/AndroidRuntime(29185): FATAL EXCEPTION: main
03-06 19:52:01.731: E/AndroidRuntime(29185): java.lang.IllegalStateException
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.graphics.Bitmap.setPixel(Bitmap.java:1045)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at com.example.testpro.EncodeActivity$3.onClick(EncodeActivity.java:90)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.view.View.performClick(View.java:4147)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.view.View$PerformClick.run(View.java:17161)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.os.Handler.handleCallback(Handler.java:615)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.os.Handler.dispatchMessage(Handler.java:92)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.os.Looper.loop(Looper.java:213)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at android.app.ActivityThread.main(ActivityThread.java:4787)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at java.lang.reflect.Method.invokeNative(Native Method)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at java.lang.reflect.Method.invoke(Method.java:511)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
03-06 19:52:01.731: E/AndroidRuntime(29185):    at dalvik.system.NativeStart.main(Native Method)

请有人帮我摆脱这个错误。请提前致谢

【问题讨论】:

  • 你应该发布一些代码来检查......
  • 很可能,您的 x 和 y 超出范围。
  • 我认为,在这种情况下,异常应该是 IllegalArgumentException 而不是 IllegalStateException。

标签: android image android-image


【解决方案1】:

java.lang.IllegalStateException 在 android.graphics.Bitmap.setPixel(Bitmap.java:1045)

如果您使用的bitmapimmutable,则会引发此异常。 As per document

原因:

result.setPixel(x,y); 

在这里,您尝试更改位图的像素。由于位图是不可变的,所以它是不允许的,因此它会抛出异常。

解决方案: 制作位图的可变副本。然后使用它。

myImageBitmap = myImageBitmap.copy(Bitmap.Config.ARGB_8888, true);

更多信息请参考Android- convert imutable bitmap to mutable

更新:

当我比较两个位图图像的像素值时,第一个 和副本,我得到相同像素的不同值,为什么?

copy(Bitmap.Config config, boolean isMutable)

尝试根据位图的尺寸制作新的位图, 将新位图的配置设置为指定的配置,然后复制 位图的像素到新位图中。如果转换不 支持,或者分配器失败,则返回 NULL。 Refer this

方法中指定的位图配置 (Bitmap.Config) 描述了像素的存储方式。这会影响质量(颜色深度)以及显示透明/半透明颜色的能力。

如果你查看 getPixel() 的文档,它会返回一个整数,它是一个颜色值。

因此,如果用于原始图像和复制图像的位图配置不同,则同一像素会得到不同的值。

可能导致像素值差异的另一个原因是像素的预乘/非预乘。 Refer this nice information from Chet Hasse.

【讨论】:

  • 我试过了,效果很好,非常感谢。而且,当我比较两个位图图像的像素值时,第一个和副本,我得到相同像素的不同值,为什么?
  • 我建议你接受它作为答案..so tgat 它将对未来的用户有用
【解决方案2】:

您需要制作位图的可变副本并使用它。

myImageBitmap = myImageBitmap.copy(Bitmap.Config.ARGB_8888, true);

查看link 以供参考。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-10
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多