在位图中反转某些颜色(Android)

时间:2015-01-13 07:36:43

标签: android colors invert

欢迎来到我在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());

enter image description here

ACTUAL 样本图片我想反转其颜色

3 个答案:

答案 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)