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 越野车颜色混合的主要内容,如果未能解决你的问题,请参考以下文章