Skia越野车颜色混合

时间:2017-12-01 13:22:37

标签: skia

我使用Skia m62使用Open GL后端并在渲染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

Picture illustrating bug

使用参数构建库: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。它包含正在观察的png和在Mac OS x86_64上运行的完整设置。

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

1 个答案:

答案 0 :(得分:0)

我将引用Skia的bugtracker的答案:

  

Skia的GPU后端不支持绘制未经过多次扫描的图像,但这是大多数编码图像的自然状态,包括所有.pngs。你所看到的是一个未经过多次运算的位图被绘制,好像它是一个预乘的位图。漂亮不是吗?

     

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

     

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

     

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

     

sk_sp img = SkImage :: MakeFromEncoded(SkData :: MakeFromFileName(“test.png”));     ...     canvas-> drawImage(img,...);

     

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

这解决了这个问题。