Skia越野车颜色混合

问题描述 投票:1回答:1

我正在使用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

skia
1个回答
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()为你做出有关格式的所有选择。

这解决了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.