Android:将ColorMatrixColorFilter应用于Paint对象的异常,但仅适用于某些位图

时间:2012-01-29 23:11:57

标签: android background bitmap runtimeexception colorfilter

我是Android编程的初学者,但我花了很多时间把它固定下来,所以希望有人知道发生了什么。我的应用程序有一堆Thing对象,每个对象都有一个位图,每个都以某种方式更改位图(更改颜色,大小等)。这一切都很好用我在MS Paint中制作的一些“测试”位图(保存为.png文件)。然而,当我用GIMP制作的更好的图片替换它们时,应用程序开始崩溃。

最终我发现如果在GIMP中选中“保存背景颜色”保存.png图像,应用程序才会崩溃。我需要这个,因为其中一些图片需要部分透明,以便它们可以叠加。然而:疯狂的是,当我尝试覆盖图像或创建图像时它没有崩溃,当我将ColorMatrixColorFilter应用于Paint对象时它会崩溃。

我不明白这是怎么回事。实际上将Paint对象应用于任何东西都远远不够,那么为什么一个图像文件可以工作,而另一个图像文件不工作?崩溃是ActivityThread.performLauncActivity中的RuntimeException,我无法找到更多关于它的信息。

这里有一些伪代码正是我在做什么以及它在哪里崩溃。

问题: 1)为什么会崩溃? 2)如果我想加载透明图像并应用彩色滤镜,将它们叠加在一起以创建新的位图等,我应该做些什么呢?只要我的所有图像都没有背景,所有这些都可以正常工作。

public class ThingHolder {

Thing[] things;

public ThingHolder() {
    things = new Thing[3];
    things[0] = new Thing();  // The first one works fine
    things[1] = new Thing();  // The second fails, see below
    ...
    // Note: It never gets far enough to draw the bitmap 
      // to a Canvas, that occurs much later
    ...
    canvas.drawBitmap(things[0].bmp, null, rect, things[0].paint);
    canvas.drawBitmap(things[1].bmp, null, rect, things[1].paint);
    }
}

public class Thing {

Bitmap bmp;
Paint paint;

public Thing() {
    bmp = getBmp(1);  // this always returns resource file circle.png
    paint = new Paint();
    paint.setColorFilter(new ColorMatrixColorFilter(redMatrix()));
    // RuntimeException occurs here if circle.png has a background color
// But it works fine if circle.png was saved in MS Paint, or in 
      // Gimp without the background color option checked
}

private float[] redMatrix() {
    float[] matrix = { 
            1, 0, 0, 0, 0, //red
            0, 0, 0, 0, 0, //green
            0, 0, 0, 0, 0, //blue
            0, 0, 0, 1, 0  //alpha
        };
    return matrix;
}
}

编辑1:这是跟踪,如果它有用:     DalvikVM [本地主机:8611]
    线程[< 1> main](Suspended(例外RuntimeException))
    ActivityThread.performLaunchActivity(ActivityThread $ ActivityRecord,Intent)行:2663
    ActivityThread.handleLaunchActivity(ActivityThread $ ActivityRecord,Intent)行:2679
    ActivityThread.access $ 2300(ActivityThread,ActivityThread $ ActivityRecord,Intent)行:125     ActivityThread $ H.handleMessage(消息)行:2033
    ActivityThread $ H(Handler).dispatchMessage(Message)行:99     Looper.loop()行:123     ActivityThread.main(String [])行:4627
    Method.invokeNative(Object,Object [],Class,Class [],Class,int,boolean)line:not available [native method]
    Method.invoke(Object,Object ...)行:521
    ZygoteInit $ MethodAndArgsCaller.run()行:868
    ZygoteInit.main(String [])行:626     NativeStart.main(String [])行:不可用[本机方法]

编辑2:这是使用2.2目标(特别是在VirtualBox中运行的android-x86-2.2-eeepc)发生的。当针对3.2目标运行时,看起来在其他地方处理Bitmap仍然存在一些问题,但它不再抛出RuntimeException。所以看起来这可能只是一个错误。

0 个答案:

没有答案