Skia 越野车颜色混合

Posted

技术标签:

【中文标题】Skia 越野车颜色混合【英文标题】:Skia buggy color blending 【发布时间】:2017-12-01 13:22:36 【问题描述】:

我在使用带有 Open GL 后端的 Skia m62 并在渲染 png 文件时出现故障。

要创建SkBitmap,我使用以下代码:

const auto codec = SkCodec::MakeFromStream(SkStream::MakeFromFile("test.png"));
const SkImageInfo imageInfo = codec->getInfo().makeColorType(kN32_SkColorType);
SkBitmap bm;
bm.allocPixels(imageInfo);
codec->getPixels(imageInfo, bm.getPixels(), bm.rowBytes());

其余代码稍作修改(找不到gl/GrGLUtil.h 标头)示例在Skia 源代码中找到:https://github.com/google/skia/blob/master/example/SkiaSDLExample.cpp

库是用参数构建的:skia_use_freetype=true skia_use_system_freetype2=false skia_use_libpng=true skia_use_system_libpng=false skia_use_expat=false skia_use_icu=false skia_use_libjpeg_turbo=false skia_use_libwebp=false skia_use_piex=false skia_use_sfntly=false skia_use_zlib=true skia_use_system_zlib=false is_official_build=true target_os="mac" target_cpu="x86_64"

这是说明问题的FULL EXAMPLE on GitHub。它包含在 Mac OS x86_64 上运行的观察和完整设置的 png。

UPD:在 Skia 跟踪器中提交了一个错误:https://bugs.chromium.org/p/skia/issues/detail?id=7361

【问题讨论】:

【参考方案1】:

我将引用 Skia 的 bugtracker 的答案:

Skia 的 GPU 后端不支持绘制未预乘的图像,但这是大多数编码图像的自然状态,包括所有 .png。您所看到的是一个未预乘位图被绘制,就好像它是一个预乘位图。漂亮是不是?

有几种简单的方法可以解决此问题。调整您拥有的代码的最简单方法是确保向 SkCodec 询问预乘输出,例如

const SkImageInfo imageInfo = codec->getInfo().makeColorType(kN32_SkColorType) .makeAlphaType(kPremul_SkAlphaType);

或者,您可以使用这种更简单的方式来解码和绘制:

sk_sp img = SkImage::MakeFromEncoded(SkData::MakeFromFileName("test.png")); ... 画布->drawImage(img, ...);

这样,SkImage::MakeFromEncoded() 可以为您做出所有关于格式的选择。

这解决了问题。

【讨论】:

以上是关于Skia 越野车颜色混合的主要内容,如果未能解决你的问题,请参考以下文章

Photoshop的混合模式

[computer graphics]透明颜色混合(Color Blending)

Alpha 混合 - 反复混合 RGBA 颜色会产生黑色

混合颜色替换

Blend混合模式 与 20余种颜色混合模式代码实现

渲染管道像素阶段“Alpha混合”