我使用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
使用参数构建库: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
答案 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()为你做出有关格式的所有选择。
这解决了这个问题。