删除图像的背景,将其拆分为相同的大小并更改颜色(叠加)

时间:2018-03-26 10:26:14

标签: android canvas paint

我一直在互联网上搜索颜色或覆盖位图的特定部分。我有一个方形位图,我想改变矩阵模式中的颜色,该矩阵模式等于9个块,从下图可以理解。 (此处的青色线仅供演示) enter image description here

我已经读过大学的边界填充算法,但是对于java,我发现它对于9个特定部分执行这样的操作来说太笨重了。我不知道如何将PaintCanvas一起用于这样的方方案。

有没有一种方法可以帮助我弄清楚如何通过提供大小或位置来绘制特定方块,而无需在UI上执行大任务。

这就是我需要实现的目标:

enter image description here

我可以自己更改颜色,位置和大小,如果有什么东西可以帮助我。 此外,由于有白色背景,有没有办法不画背景或我是否必须使用PNG?

更新

我已成功使用以下代码将图像分成9个相等的部分,但PorterDuffColorFilter未按预期工作。

代码:

public void splitBitmap(Bitmap bitmap) {
        int width, height;
        // Divide the original bitmap width by the desired vertical column count
        width = bitmap.getWidth() / 3;
        // Divide the original bitmap height by the desired horizontal row count
        height = bitmap.getHeight() / 3;
        // Loop the array and create bitmaps for each coordinate
        for (int x = 0; x < 3; ++x) {
            for (int y = 0; y < 3; ++y) {
                // Create the sliced bitmap
                smallimages.add(Bitmap.createBitmap(bitmap, x * width, y * height, width, height));
            }
        }
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }

上面的代码提供了9个位图,然后设置为GridLayout。但是没有PorterDuffColorFilter模式是有用的。图像保持原始状态或完全绘制。我已经尝试了所有可用的模式,但都没有。

1 个答案:

答案 0 :(得分:1)

我已经做了类似的事情,所以在稍微改变我的代码后,我认为这就是你想要的:

假设你没有PNG,

首先,从图片Source中删除白色背景:
将白色设置为透明,您可以使用任何所需的颜色。

private static final int[] FROM_COLOR = new int[]{255, 255, 255};
private static final int THRESHOLD = 3;

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_colors);

    ImageView iv = (ImageView) findViewById(R.id.img);
    Drawable d = getResources().getDrawable(RES);
    iv.setImageDrawable(adjust(d));
}

private Drawable adjust(Drawable d)
{
    int to = Color.TRANSPARENT;

    //Need to copy to ensure that the bitmap is mutable.
    Bitmap src = ((BitmapDrawable) d).getBitmap();
    Bitmap bitmap = src.copy(Bitmap.Config.ARGB_8888, true);
    for(int x = 0;x < bitmap.getWidth();x++)
        for(int y = 0;y < bitmap.getHeight();y++)
            if(match(bitmap.getPixel(x, y))) 
                bitmap.setPixel(x, y, to);

    return new BitmapDrawable(bitmap);
}

private boolean match(int pixel)
{
    //There may be a better way to match, but I wanted to do a comparison ignoring
    //transparency, so I couldn't just do a direct integer compare.
    return Math.abs(Color.red(pixel) - FROM_COLOR[0]) < THRESHOLD &&
        Math.abs(Color.green(pixel) - FROM_COLOR[1]) < THRESHOLD &&
        Math.abs(Color.blue(pixel) - FROM_COLOR[2]) < THRESHOLD;
}

上面的代码会将颜色更改为透明,下面的代码会将位图拆分为9个相同大小的位图:

public void splitBitmap(Bitmap bitmap) {
        ArrayList<Bitmap> smallimages = new ArrayList<>(9);
        int width, height;
        // Divide the original bitmap width by the desired vertical column count
        width = bitmap.getWidth() / 3;
        // Divide the original bitmap height by the desired horizontal row count
        height = bitmap.getHeight() / 3;
        // Loop the array and create bitmaps for each coordinate
        for (int x = 0; x < 3; ++x) {
            for (int y = 0; y < 3; ++y) {
                // Create the sliced bitmap
                smallimages.add(Bitmap.createBitmap(bitmap, x * width, y * height, width, height));
            }
        }
    }

最后,您可以在每个位图上使用PorterDuffColorFilter

    imageView.setImageDrawable(arrayList.get(0));
    imageView.setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_ATOP);

可能存在问题,因为它对我有用,可能对您不适用,但这是您实现所需结果的方式。 如果任何问题仍然存在,我可以提供帮助。