1

我正在编写一个处理大型位图的 Android 应用程序,并且需要将位图拆分为单独的“图块”并单独处理每个图块,然后再将它们重新组合到最终位图中。

关于如何做到这一点的任何线索?我认为使用 createBitmap() 并在几个嵌套的 for 循环中指定较小的图块会很简单,但这并不像我想象的那么容易,因为 setPixels 不像我想象的那样工作。

我遇到的一个复杂情况是,“图块”需要在它们不在较大位图边缘的地方重叠,因为处理需要在位图两侧看到几个额外的像素。如果不需要通过简单地在图像边缘添加几层黑色像素来分割图像,我可以解决这个问题,但这不适用于瓷砖,因为它们需要实际周围像素的信息或处理将不起作用。

有没有更简单的方法来做到这一点?如果没有,我该如何使用 setPixels 和 createBitmap 来做呢?

到目前为止我的代码:

        Bitmap finalImg = Bitmap.createBitmap(sourceImage.getWidth(), sourceImage.getHeight(), Bitmap.Config.ARGB_8888);  //Bitmap to store the final, processed image
        Bitmap tile = null;  //Temporary Bitmap to store tiles

        int tileDiameter = 500;  //Width and height of tiles
        int borderWidth = 5;  //Amount of pixel overlap from other tiles

        for (int y = 0 ; y < sourceImage.getHeight() ; y += tileDiameter) {
            for (int x = 0 ; x < sourceImage.getWidth() ; x += tileDiameter) {
                if (x == 0) {
                    if (y == 0) {
                        tile = Bitmap.createBitmap(sourceImage, x, y, (tileDiameter + borderWidth), (tileDiameter + borderWidth));
                    }
                    else {
                        tile = Bitmap.createBitmap(sourceImage, x, (y - borderWidth), (tileDiameter + borderWidth), (tileDiameter + borderWidth));
                    }
                }
                else {
                    if (y == 0) {
                        tile = Bitmap.createBitmap(sourceImage, (x - borderWidth), y, (tileDiameter + borderWidth), (tileDiameter + borderWidth));
                    }
                    else {
                        tile = Bitmap.createBitmap(sourceImage, (x - borderWidth), (y - borderWidth), (tileDiameter + borderWidth), (tileDiameter + borderWidth));
                    }
                }
                processor.process(tile);
                //I need to attach this (processed) tile to it's correct location in finalImg. How!??
            }
        }
4

1 回答 1

2

您可以使用Canvas.drawBitmap将处理后的图块绘制回结果位图。像这样使用函数:

Canvas canvas = new Canvas(finalImg);
canvas.drawBitmap(tile,
                  null,
                  new Rect(x, y,
                           x + tileDiameter, y + tileDiameter),
                  null);

另请注意,您可能需要获取一个可变副本,tile因为您从中获得的副本Bitmap.createBitmap是不可变的。

于 2013-08-12T04:39:07.267 回答