Android:如何将位图的一部分变成黑白色,并保留其余颜色?

3
我有一个位图显示在 ImageView 中,我希望能够将图像的一定比例转换成黑白,而其他部分保留其颜色。例如,如果目标比例为60%,则图像将如下所示:would look like this。谢谢。
1个回答

2
我有一张位图显示在ImageView中,我希望能够使图像的某个百分比变为黑白,并使其余部分保留颜色。例如,如果目标百分比是60%。
从您的图片中看来,您指的是单色(即灰度),而不是黑白。
以下代码可以实现此功能(已经测试过,运行正常):
void doIt(ImageView image)
{
    //get bitmap from your ImageView (image)
    Bitmap originalBitmap = ((BitmapDrawable)image.getDrawable()).getBitmap();

    int height = originalBitmap.getHeight();
    int fortyPercentHeight = (int) Math.floor(height * 40.0 / 100.0);

    //create a bitmap of the top 40% of image height that we will make black and white
    Bitmap croppedBitmap = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth() , fortyPercentHeight );
    //make it monochrome
    Bitmap blackAndWhiteBitmap = monoChrome(croppedBitmap);
    //copy the monochrome bmp (blackAndWhiteBitmap) to the original bmp (originalBitmap)
    originalBitmap = overlay(originalBitmap, blackAndWhiteBitmap);
    //set imageview to new bitmap
    image.setImageBitmap(originalBitmap );
}

Bitmap monoChrome(Bitmap bitmap)
{
    Bitmap bmpMonochrome = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bmpMonochrome);
    ColorMatrix ma = new ColorMatrix();
    ma.setSaturation(0);
    Paint paint = new Paint();
    paint.setColorFilter(new ColorMatrixColorFilter(ma));
    canvas.drawBitmap(bitmap, 0, 0, paint);
    return bmpMonochrome;
}

Bitmap overlay(Bitmap bmp1, Bitmap bmp2) 
{
    Bitmap bmp3 = bmp1.copy(Bitmap.Config.ARGB_8888,true);//mutable copy
    Canvas canvas = new Canvas(bmp3 );
    canvas.drawBitmap(bmp2, new Matrix(), null);
    return bmp3 ;
}

这个完美地运作了,我以前从未使用过画布,所以很高兴有机会学习它们。谢谢。 - KOG
欢迎@KOG。作为新用户,这个网站可能有点令人生畏(我们有相当严格的质量控制,不像其他网站)。请花点时间查看网站指南(你会得到一个徽章!)。享受StackOverflow吧。准备好接受对你问题的残酷分析吧!这是一个大多数由用户监控的网站,所以涉及到人的地方,随机事件总会发生。如果你有投诉,请向版主(flag)反映。记得对你喜欢或不喜欢的事物进行投票,这对于质量控制非常重要。祝你好运。 - Jon Goodwin
我该如何反转这个过程?也就是说,从黑白图像开始,让彩色版本的图像填充前40%?我似乎无法让它正常工作。 - KOG
嗯,看起来你没有理解代码,你想要的很简单,croppedBitmap需要为底部的60%。这一切都与坐标有关。我会给你一个起点 Bitmap croppedBitmap = Bitmap.createBitmap(originalBitmap, 0, fortyPercentHeight, originalBitmap.getWidth() , originalBitmap.getHeight()); - Jon Goodwin
我希望原始的位图现在变成黑白的。我稍微修改了您的代码,所以我发了一个单独的帖子,请在这里查看:https://stackoverflow.com/questions/50124575/android-cropping-an-image-from-the-bottom-up - KOG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接