拆分位图文件产生y + height必须是< = bitmap.height()错误

时间:2016-09-06 08:04:33

标签: java android android-bitmap

我试图用我做的这个方法来分割位图:

private List<Bitmap> splitBitmap(File file, int everyPixel)
{
    Bitmap comicBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
    List<Bitmap> segments = new ArrayList<Bitmap>();

    if(comicBitmap == null)
        return segments;

    int height = comicBitmap.getHeight();
    int width = comicBitmap.getWidth();
    int h = 0;

    for(int i = 0; i < height; i += everyPixel)
    {
        i = i >= height? height : i;

        Bitmap bitmap = Bitmap.createBitmap(comicBitmap, 0, i, width, i + everyPixel);
        segments.add(bitmap);
    }

    return segments;
}

我正在处理的位图大小为240x4298。它是一个非常非常长的形象。我需要生成一个位图列表(来自原始源的分段位图)。当i达到2400时,它会发出错误说:

Caused by: java.lang.IllegalArgumentException: y + height must be <= bitmap.height()

我的逻辑如下: 1.)我从y轴开始0像素到400像素 2.)我从y轴开始400像素到800像素 依此类推......

目前的迭代尚未达到4298而且它的抱怨(2400px)。有没有想过为什么会这样呢?

谢谢!

2 个答案:

答案 0 :(得分:1)

正如我从您的代码中看到的那样,问题在于:

Bitmap bitmap = Bitmap.createBitmap(comicBitmap, 0, i, width, i + everyPixel);

例如,您有width = 1000, height = 3000,但everyPixel = 2000。在循环的第二次迭代中,您将获得i = 2000,并且您将尝试通过使用left = 0,top = 2000,width = 1000和height = i + everyPixel = 4000获得部分来创建位于comicbitmap的位图,但是整体高度位图是3000,所以你得到这个错误。

有关详细信息,请参阅thisthis

答案 1 :(得分:1)

所以这是我的新方法:

private List<Bitmap> splitBitmap(File file, int everyPixel)
{
    Bitmap comicBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
    List<Bitmap> segments = new ArrayList<>();

    if(comicBitmap == null)
        return segments;

    int height = comicBitmap.getHeight();
    int width = comicBitmap.getWidth();

    for(int i = 0; i < height; i += everyPixel)
    {
        i = i >= height? height : i;
        int limit = i + everyPixel >= height? height - i : everyPixel;

        Bitmap bitmap = Bitmap.createBitmap(comicBitmap, 0, i, width, limit);
        segments.add(bitmap);
    }

    return segments;
}

注意以下几行:

i = i >= height? height : i;
int limit = i + everyPixel >= height? height - i : everyPixel;

这实际上确保考虑所有像素。例如在我的情况下,高度是4298,我达到4000.由于我需要处理最后298,限制应该只是298而不是我的everyPixel值。

我看到的方式是方法Bitmap.createBitmap(comicBitmap, 0, i, width, limit)第三个参数(y)实际上添加到第5个参数(高度)。因此,如果我想处理400-800像素,它应该是:

Bitmap.createBitmap(comicBitmap, 0, 400, width, 400);

第三个参数在评估位图的最终高度时添加到第5个。

我发现这非常直观。但我猜它只是我。