Android位图蒙版颜色,删除颜色

如何解决Android位图蒙版颜色,删除颜色

| 我正在创建位图,接下来我将在其上绘制第二个纯色位图。 现在我想更改第一个位图,这样我在上面绘制的纯色将是透明的。 或者简单地说,我想从位图中删除一种颜色的所有像素。 我曾尝试过所有滤色镜,并且xfermode运气不好,除了逐像素地进行除色之外,还有其他方法可以去除颜色吗?     

解决方法

        这适用于从位图中删除某种颜色。主要部分是避免使用Xerxmode。如果尝试将一种颜色更改为另一种颜色,它也应该起作用。 我应该补充一点,这回答了从位图中删除颜色的问题标题。像OP所说的那样,使用PorterDuff Xfermode可以更好地解决特定问题。
// start with a Bitmap bmp

// make a mutable copy and a canvas from this mutable bitmap
Bitmap mb = bmp.copy(Bitmap.Config.ARGB_8888,true);
Canvas c = new Canvas(mb);

// get the int for the colour which needs to be removed
Paint p = new Paint();
p.setARGB(255,255,0); // ARGB for the color,in this case red
int removeColor = p.getColor(); // store this color\'s int for later use

// Next,set the alpha of the paint to transparent so the color can be removed.
// This could also be non-transparent and be used to turn one color into another color            
p.setAlpha(0);

// then,set the Xfermode of the pain to AvoidXfermode
// removeColor is the color that will be replaced with the pain\'t color
// 0 is the tolerance (in this case,only the color to be removed is targetted)
// Mode.TARGET means pixels with color the same as removeColor are drawn on
p.setXfermode(new AvoidXfermode(removeColor,AvoidXfermode.Mode.TARGET));

// draw transparent on the \"brown\" pixels
c.drawPaint(p);

// mb should now have transparent pixels where they were red before
    ,        user487252的解决方案一直很吸引人,直到API级别16(Jelly Bean),此后ѭ1似乎根本不起作用。 在我的特定用例中,我已经将PDF页面(通过APV PDFView)呈现为像素数组
int[]
,并将传递给
Bitmap.createBitmap( int[],int,Bitmap.Config )
。此页面包含绘制在白色背景上的线条图,并且我需要在保留抗锯齿的同时删除背景。 我找不到能完全满足我要求的Porter-Duff模式,所以最终屈曲并迭代像素并逐一转换。结果出奇的简单和高效:
int [] pixels = ...;

for( int i = 0; i < pixels.length; i++ ) {
    // Invert the red channel as an alpha bitmask for the desired color.
    pixels[i] = ~( pixels[i] << 8 & 0xFF000000 ) & Color.BLACK;
}

Bitmap bitmap = Bitmap.createBitmap( pixels,width,height,Bitmap.Config.ARGB_8888 );
这是绘制线条艺术的理想选择,因为可以在不丢失抗锯齿的情况下为线条使用任何颜色。我在这里使用红色通道,但可以通过将
16
而不是
8
移至绿色,或将blue7ѭ移至蓝色来使用。     ,        逐像素不是一个坏选择。只是不要在循环内调用setPixel。用getPixels填充argb int数组,如果不需要保留原始数组,请对其进行修改,然后在最后调用setPixels。如果您担心内存问题,可以逐行执行此操作,也可以一次完成整个操作。您无需为覆盖颜色填充整个位图,因为您只需进行简单的替换即可(如果当前像素为color1,则设置为color2)。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?