欢迎来到我在stackoverflow.com上的第一个问题:)
我试图在Android应用中反转Bitmap的特定颜色
这个想法是为孩子们讲故事的夜间模式阅读
故事页面丰富多彩,包括文字..
我在正常模式下加载图像;它将按原样显示 但是当用户激活夜间模式(在阅读过程中按下按钮)时,我想反转图像的颜色 但不所有颜色,,,只有任何黑色像素要反转为白色,,,并保留其他颜色,,,,
以下是我想要做的事情的说明(上部是反转所有颜色,,,我想实现插图的下半部分): 我使用下面的代码,但仍然反锯齿的黑色像素没有很好地反转!!
//Code snipet
Bitmap copy = myBitmap.copy(myBitmap.getConfig(), true);
int length = copy.getWidth() * copy.getHeight();
int[] array = new int[length];
copy.getPixels(array,0,copy.getWidth(),0,0,copy.getWidth(),copy.getHeight());
for (int i=0;i<length-(length/10);i++){
//trying to overcome text anti-aliasing
if ( (array[i] & 0x00FFFFFF) <= 0x00222222)
{
array[i] = 0xffffffff;
}
}
copy.setPixels(array,0,copy.getWidth(),0,0,copy.getWidth(),copy.getHeight());
ACTUAL 样本图片我想反转其颜色
答案 0 :(得分:0)
如果您肯定想要反转每种颜色,那么可以在运行时通过代码完成。
但是,为了提高性能和简洁性,如果您事先知道图像是什么,最好事先在像Photoshop这样的图像编辑工具中创建反转图像。这样你就可以完全控制它们。将它们加载到活动中,但隐藏倒置图像。
使用
view.setVisibility(View.INVISIBLE) and view.setVisibility(View.VISIBLE)
最初将可见性设置为不可见,然后在需要时将其更改为可见。
答案 1 :(得分:0)
&#34; BackBitmap&#34;将是您尝试转换的Bitmap对象。
步骤1是通过getPixels(...)方法将所有像素颜色存储在数组中。 (这将逐行存储颜色。这对于理解下一步非常重要。)
第2步:创建第二个一维数组,通过调用getPixel(...)来存储位图中的每个像素
步骤3:使用 if 语句转换所需范围所需的颜色&#34; if((array [i]&amp; 0x00FFFFFF)&lt; = 0x00222222 || 您的黑色范围)&#34;然后是将正图像转换为负图像的简单公式,反之亦然: neg_col = 0xFFFFFF - orig_col; 。:array [i] = 0xFFFFFF - array2 [i];
//step 1
int length = BackBitmap.getWidth() * BackBitmap.getHeight();
int[] array = new int[length];
BackBitmap.getPixels(array, 0, BackBitmap.getWidth(), 0, 0, BackBitmap.getWidth(), BackBitmap.getHeight())
//step 2
int[] array2 = new int[length];
int a2 = 0;
for(int col = 0; col < BackBitmap.getHeight(); col++){
for (int row = 0; row < BackBitmap.getWidth();row++){
array2[a2] = BackBitmap.getPixel(row,col);
a2++;
}
}
//step 3
for (int i=0;i<length;i++){
if ((array[i] & 0x00FFFFFF) <= 0x00222222){
array[i] = 0xFFFFFF - array2[i];
}
}
//the next line is here just to "override" this Bitmap's immutamility
BackBitmap = BackBitmap.copy(Bitmap.Config.ARGB_8888, true);
BackBitmap.setPixels(array, 0, BackBitmap.getWidth(), 0, 0, BackBitmap.getWidth(), BackBitmap.getHeight());
希望这有助于那些努力将位图转换为负面图片的人们。在这种情况下,请忽略 if 语句。
答案 2 :(得分:0)
只需在位图的每个像素上循环并反转其颜色,如下所示:
private void inverseBitmapColors(Bitmap bitmap) {
for (int i = 0; i < bitmap.getWidth(); i++) {
for (int j = 0; j < bitmap.getHeight(); j++) {
bitmap.setPixel(i, j, bitmap.getPixel(i, j) ^ 0x00ffffff);
}
}
}
^是XOR-如果两个位中只有一个为1,则将每个位设置为1 我们将此操作应用于值为0x00ffffff的像素颜色 那是因为位图颜色值以这种形式存储在32位上:
第1个8位(透明度)
第2个8位为红色
绿色的第3个8位
蓝色的第4个8位
我们需要反转颜色,因此无需触摸alpha,因此我们将xor的值设置为0x00(值0x00ffffff的前2个数字)(二进制为00000000),因此alpha永远不会更改为红色绿色和蓝色,我们需要得到它们的补码,所以我们对每个像素应用xor值0xff(11111111)