首页 文章

使用ColorMatrixColorFilter时,Canvas不会绘制位图

提问于
浏览
0

我在使用ColorMatrixColorFilter修改位图中的颜色像素时遇到了困难 . 如果我使用本地文件系统(jpg)中的位图,它可以工作 . 但是,如果我使用从Buffer创建的位图,则画布上不会绘制任何内容 .

特别是,我使用以下代码来创建ColorMatrix:

float matrix[] = new float[] {
            0, 0, 1, 0, 0,
            0, 1, 0, 0, 0,
            1, 0, 0, 0, 0,
            0, 0, 0, 1, 0
    };
    rbSwap = new ColorMatrix(matrix);
    paint = new Paint(Paint.FILTER_BITMAP_FLAG);
    paint.setColorFilter(new ColorMatrixColorFilter(rbSwap));

上面用于创建ColorMatrixColorFilter,用于交换红色和蓝色 .

如果我使用以下代码创建位图,它可以工作:

bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.picture);

如果我使用以下代码创建位图,则不会向画布绘制任何内容:

bitmap = Bitmap.createBitmap((int) width, (int) height,
            Bitmap.Config.ARGB_8888);

srcBuffer = ByteBuffer.wrap(data);
    srcBuffer.rewind();
    bitmap.copyPixelsFromBuffer(srcBuffer);

我的onDraw()如下所示:

public void onDraw(Canvas canvas) {
    canvas.drawBitmap(spicebmp, offsetX, offsetY, paint);
}

如果我没有设置colorfilter,则位图会在我的画布上呈现 . 如果我设置了colorfilter,它只是一个黑屏 - 没有任何东西可以呈现 . 如果我使用jpg位图而不是我通过缓冲区创建的位图,则使用红色/蓝色交换绘制 .

我将矩阵更改为与单位矩阵相同,并且正确渲染位图 . 如果我更改矩阵中的任何单个浮点数(如1s到.5s或0),则不会绘制任何内容 .

我还检查过以确保位图有足够的“字节”来表示位图 . bitmap.byteCount()== srcBuffer.limit()为true - 所以我的缓冲区中的字节与我传入的宽度/高度应该存在的字节相同 .

我在onDraw期间为try任何异常设置了try / catch,并通过logcat输出,但没有看到任何异常 . 我在Android位图绘图代码中看了一下,看到了以下内容:

// nothing to draw
if (fClip->isEmpty() ||
        bitmap.width() == 0 || bitmap.height() == 0 ||
        bitmap.getConfig() == SkBitmap::kNo_Config ||
        (origPaint.getAlpha() == 0 && origPaint.getXfermode() == NULL)) {
    return;
}

我没有能力跟踪核心中的C代码,所以我无法判断这是否触发 . 但我知道我的位图的宽度和高度都是非零(它们是800和600),我知道我的位图在创建时设置为ARGV_8888类型,并且完全相同的绘制对象用于jpg加载从磁盘(工作的那个)和我使用copyPixelsFromBuffer()创建的磁盘 .

所以我不确定我做错了什么 . 我认为位图中的某些标志或属性与colorFiltering不兼容,但它只是一个类型为ARGB_8888的简单ByteBuffer . 当然,完全相同的代码(绘图对象等)用于设置过滤器 .

那么我需要用Bitmap做些什么吗?使用ColorMatrix / Filter?

1 回答

  • 0

    事实证明,我的minsdkversion设置为版本10.当我添加了14的targetsdkversion时,现在一切正常 . 显然,ColorMatrixColorFilter对于旧版本的Android(pre-Honeycomb)具有不同的行为/界面 .

    在每个旧版本中,如果alpha通道字节为0,则应用于Alpha通道的矩阵值始终为0.矩阵中的第五个值未添加到公式中 .

相关问题