java - 安卓位图操作

标签 java android bitmap bit-manipulation mutable

你能告诉我这段代码有什么问题吗?

//bmp is a bitmap of already present image
int width=bmp.getWidth();
int height=bmp.getHeight();
int rgbval[]=new int[width*height];
bmp.getPixels(rgbval, 0, width, 0, 0, width, height);
rgbval=actual(rgbval);
Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true);
bmp2.setPixels(rgbval, 0, width, 0, 0, width, height);

actual 是我创建的一个函数,用于操作 bmp 的 rgb 值。通过使用 eclipse 的调试功能,我检查了它是否正常工作,但是当我尝试恢复 bmp2 的 rgb 值时,我没有得到操纵值。

最佳答案

首先,看到这个答案:Android Bitmap setPixel doens't work correctly? (set value, then read a different value)

因此,如果您的原始图像没有 alpha channel (即 hasAlpha() 返回 false),它似乎会自动将 rgb 值转换为预乘格式。 那是你正在经历的吗? bmp.hasAlpha() 是假的吗?

我刚刚使用默认的 android 图标作为位图测试了您的代码,hasAlpha() 返回 true。输入和输出颜色数组中的 alpha channel 是相同的。但是,对于 2304 个像素中的 15 个,红色 channel 有一个或两个偏移。我没有检查蓝色或绿色 channel 。我假设这是内部舍入错误?我发布了我使用的相当冗长且仅用于测试的代码,以防万一有人要添加任何其他内容。

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.icon);

int width=bmp.getWidth();
int height=bmp.getHeight();
int rgbval[]=new int[width*height];
bmp.getPixels(rgbval, 0, width, 0, 0, width, height);
int rgbval2[] = actual(rgbval);

Bitmap bmp2=bmp.copy(Bitmap.Config.ARGB_8888,true);
bmp2.setPixels(rgbval2, 0, width, 0, 0, width, height);

int rgb2[] = new int[width*height];
bmp2.getPixels(rgb2, 0, width, 0, 0, width, height);

int alpha1[] = new int[width*height];
int alpha2[] = new int[width*height];
int red1[] = new int[width*height];
int red2[] = new int[width*height];

for(int i=0; i<alpha2.length; ++i) {
    alpha1[i] = Color.alpha(rgbval2[i]);
    alpha2[i] = Color.alpha(rgb2[i]);
    red1[i] = Color.red(rgbval2[i]);
    red2[i] = Color.red(rgb2[i]);

    if(red1[i]!=red2[i]) {
        int a1 = alpha1[i];
        int a2 = alpha2[i];
        int r1 = red1[i];
        int r2 = red2[i];


        Log.e("E", String.format("a1: %d, a2: %d, r1: %d, r2: %d", a1, a2, r1, r2));
    }
}


private int[] actual(int rgb[]) {
    int rgb2[] = new int[rgb.length];

    for(int i=0; i<rgb.length; ++i) {
        rgb2[i] = Color.argb(Color.alpha(rgb[i]), Color.red(rgb[i])/2,  
                      Color.green(rgb[i])/2, Color.blue(rgb[i])/2);
    }

    return rgb2;
}

这是 LogCat 输出

a1: 64, a2: 64, r1: 30, r2: 32
a1: 64, a2: 64, r1: 30, r2: 32
a1: 142, a2: 142, r1: 58, r2: 57
a1: 142, a2: 142, r1: 58, r2: 57
a1: 216, a2: 216, r1: 56, r2: 55
a1: 216, a2: 216, r1: 56, r2: 55
a1: 57, a2: 57, r1: 6, r2: 4
a1: 59, a2: 59, r1: 6, r2: 4
a1: 231, a2: 231, r1: 90, r2: 91
a1: 216, a2: 216, r1: 95, r2: 94
a1: 216, a2: 216, r1: 95, r2: 94
a1: 217, a2: 217, r1: 57, r2: 58
a1: 216, a2: 216, r1: 88, r2: 89
a1: 199, a2: 199, r1: 66, r2: 67
a1: 199, a2: 199, r1: 39, r2: 38

关于java - 安卓位图操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8074001/

相关文章:

java - 检查表数据 - Jsoup

android - 在 API 11+ 上调用 bitmap.recycle() 有什么作用?

matrix - APL编程-如何将简单的矩阵转换为图片?

java - 生成丰富的:menu hierarchical structure from rich:tree

java - 在运行时更改 JComboBox 的内容

Java2D 和 Swing 不使用 JFrames 和 JPanels 输出图像

java - Maven 从两个单独的 pom.xml 部署两个具有不同分类器的 jar

Android 11后台定位权限 "Allow only while using the app"不授予权限

android - 将图像从 ios/c++ 代码传递到 JNI Android

android - 内存中和保存到文件的位图对于相同的 byte[] 是不同的