我试图用我做的这个方法来分割位图:
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)。有没有想过为什么会这样呢?
谢谢!
答案 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,所以你得到这个错误。
答案 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个。
我发现这非常直观。但我猜它只是我。