将图像转换为灰度图像时,应用程序不响应

时间:2013-03-12 10:49:01

标签: java android multithreading image image-processing

我正在尝试开发一款可以对现有图片应用一些基本效果的应用。我带着相当多的O.K。但是当我开始玩像素时,它就停止了工作。有人能帮帮我吗?我应该使用另一个线程而不是主线程来编写以下代码吗?

         int[] imagePixels = new int[picWidth * picHeight];
         bitmap.getPixels(imagePixels, 0, picWidth, 0, 0, picWidth, picHeight);


         for (int y = 0; y < picHeight; y++) {

             for (int x = 0; x < picWidth; x++) {

                 int index = y * picWidth + x;
                 int red = (imagePixels[index] >> 16) & 0xff;     
                 int green = (imagePixels[index] >> 8) & 0xff;
                 int blue = imagePixels[index] & 0xff;

                 red = (int) Math.abs(red-255);
                 green = (int) Math.abs(green-255);
                 blue = (int) Math.abs(blue-255);

                 imagePixles[index] = 0xff000000 | (red << 16) | (green << 8) | blue;

                 }
        }
        bitmap.setPixels(imagePixels, 0, picWidth, 0, 0, picWidth, picHeight);

1 个答案:

答案 0 :(得分:1)

如果您正在编写GUI代码(AWT / Swing /等),则第一条规则永远不会在分派线程中执行任何CPU密集型操作。

如果您正在响应用户输入 - 例如鼠标单击,触摸或菜单选择 - 并且您计划执行一些会占用大量处理器时间的事情,请分离一个单独的线程来完成工作,然后提交作业完成后事件队列中的事件。

这样,UI就会响应,并且当您想要在应用效果后刷新部分显示时,它将响应用户生成的事件和以编程方式生成的事件。

这是任何UI编码的一般建议,有人可能能够添加更多关于Android特定功能;我的猜测是Android操作系统没有得到它注入事件处理队列的事件的响应,因此假设你的应用程序已经死了,而实际上它还活着,只是忙于在调度线程中执行某些事情时应该'是的。

希望有所帮助。