如何删除Android中图像的空白区域?

给定一个带alpha通道(透明度)的图像,我想删除图像边界和实际图像之间的空白区域。 这应该在背景任务或加载屏幕中完成,并且具有可接受的运行时间以不削弱用户体验。

在这里输入图像说明

我怎样才能达到这个结果?

Solutions Collecting From Web of "如何删除Android中图像的空白区域?"

我很难find最佳实践或甚至build议来解决我的问题。 在JannGabriel的基础上,通过缩小图像大小来裁剪图像的右下angular,我设法进一步去除了顶部和左侧的空白区域,并且通常会缩短加工时间。 结果是好的,我目前在我的项目中使用它。 我对Android编程相当陌生,对此方法的任何build议都是值得欢迎的。

public static Bitmap TrimBitmap(Bitmap bmp) { int imgHeight = bmp.getHeight(); int imgWidth = bmp.getWidth(); //TRIM WIDTH - LEFT int startWidth = 0; for(int x = 0; x < imgWidth; x++) { if (startWidth == 0) { for (int y = 0; y < imgHeight; y++) { if (bmp.getPixel(x, y) != Color.TRANSPARENT) { startWidth = x; break; } } } else break; } //TRIM WIDTH - RIGHT int endWidth = 0; for(int x = imgWidth - 1; x >= 0; x--) { if (endWidth == 0) { for (int y = 0; y < imgHeight; y++) { if (bmp.getPixel(x, y) != Color.TRANSPARENT) { endWidth = x; break; } } } else break; } //TRIM HEIGHT - TOP int startHeight = 0; for(int y = 0; y < imgHeight; y++) { if (startHeight == 0) { for (int x = 0; x < imgWidth; x++) { if (bmp.getPixel(x, y) != Color.TRANSPARENT) { startHeight = y; break; } } } else break; } //TRIM HEIGHT - BOTTOM int endHeight = 0; for(int y = imgHeight - 1; y >= 0; y--) { if (endHeight == 0 ) { for (int x = 0; x < imgWidth; x++) { if (bmp.getPixel(x, y) != Color.TRANSPARENT) { endHeight = y; break; } } } else break; } return Bitmap.createBitmap( bmp, startWidth, startHeight, endWidth - startWidth, endHeight - startHeight ); } 

说明:对于图像的每一侧,运行FOR循环来检查像素是否不包含透明颜色,返回第一个不透明像素的有用坐标。 这是完成阐述坐标使用作为一个基地相反的维度比修剪的维度:findy,扫描x每y。

要检查垂直顶部空白区域的结束位置,将执行以下步骤:

  1. 从第一行开始(y = 0)
  2. 检查行的所有列(x从0到imageWidth)
  3. 如果find一个不透明的像素,则打破循环并保存y坐标。 否则继续。
  4. 在列的结尾处,转到下一行(y + 1)并开始检查列的重复。 如果已经find不透明的像素,请打破。

其他维度使用了类似的方法,只是改变了扫描的方向。

一旦获得图像的第一个有用像素的4个坐标,将调用Bitmap.createBitmap方法,原始位图作为基础图像,有用的像素坐标为resize的左上angular和右下angular限制。

注1:注意坐标0,0等于左上angular是有用的。

注2:Bitmap.createBitmap中的结束宽度和高度被新的起始相对坐标减小,否则新图像将错误地向右下方推移。 像这样:你有一个图像100x100px,所以结束坐标100,100。 将开始坐标改为50,50将使精化矩形的结束坐标为150,150(100原始坐标+修改起始点的50),将其推到原始图像边界之外。 为了避免这种情况,新的起始坐标减less了新的起始坐标(100 + 50个新起始坐标 – 50个新起始坐标调整)

注意3:在原始答案中,检查给定方向上的所有像素是否使用与要查找的坐标相同的维度运行,从而返回最高级的有用像素。 检查相反的维度,并停止在第一个有用的像素增加表演。