0

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

特别是,我使用以下代码来创建 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);
}

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

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

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

我在 onDraw 期间对任何异常进行了尝试/捕获,并通过 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。当然,完全相同的代码(绘制对象等)用于设置过滤器。

那么我还需要对位图做些什么吗?使用 ColorMatrix/Filter?

4

1 回答 1

0

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

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

于 2012-06-25T21:41:50.247 回答