循环通过位图像素来改变android中位图的颜色

时间:2013-11-23 01:01:21

标签: android bitmap

我正在尝试根据十六进制值更改位图的颜色。

在我尝试使用我的颜色选择器中选择的颜色的myBitmap.setPixel之前,我只是试图让它与rgb一起工作:

    for (int x = 0; x <= myBitmap.getWidth(); x++) {

            for (int y = 0; x <= myBitmap.getHeight(); y++) {

                myBitmap.setPixel(x, y, Color.rgb(255, 255, 255));

            }

        }

如果我只设置一个像素:

    bitmapPreview.setPixel(50, 50, Color.rgb(255, 255, 255));

它工作正常,但当我尝试循环遍历位图像素时,它强制关闭应用程序

关于如何进行此项工作的任何建议,或关于如何根据颜色选择器返回的值更改位图颜色的其他建议。从颜色选择器返回的值的格式为:white = -1或蓝色阴影= -15658590

谢谢!

2 个答案:

答案 0 :(得分:4)

如果这是您正在使用的确切代码,则您的循环条件是错误的。您在两个维度中超出了位图的限制1个像素,并且您使用了错误的变量来检查其中一个维度。在两个循环中将<=更改为<,并将条件中的x更改为y

for (int x = 0; x < myBitmap.getWidth(); x++) {
    for (int y = 0; y < myBitmap.getHeight(); y++) {
        myBitmap.setPixel(x, y, Color.rgb(255, 255, 255));
    }
}

答案 1 :(得分:2)

应用程序强制关闭的原因是您正在执行CPU密集型操作。 您的长时间运行操作应始终在AsyncTask中执行,而不是在应用程序的UI线程上执行。

选项1:

创建一个AsyncTask的Sub类&lt;&gt; class并在doInBackground方法中执行像素操作。这不会强制关闭应用程序

选项2 :(更好地选择位图操作)

使用RenderScript执行此类图形操作。 RenderScript是跨平台的,可以比在java代码中循环更快地执行像素操作。