我使用Skia m62和Open后端,并在呈现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"
下面是说明这个问题的GitHub上的完整示例。它包含观察中的png,以及在Mac x86_64上运行的完整设置。
UPD:在Skia跟踪器中发现了一个bug:https://bugs.chromium.org/p/skia/issues/detail?id=7361
发布于 2017-12-18 19:15:53
我将引用Skia的窃听器的答案:
Skia的GPU后端不支持绘制未经预处理的图像,但这是大多数编码图像(包括所有.pngs )的自然状态。您所看到的是一个被绘制的非乘位图,就好像它是一个预相乘的位图。很漂亮不是吗? 有几种简单的方法可以解决这个问题。调整代码的最简单方法是确保向SkCodec请求预乘输出。 const SkImageInfo imageInfo = .makeAlphaType(kPremul_SkAlphaType); 或者,您可以使用这种更简单的方式来解码和绘制: SkImage::MakeFromEncoded(SkData::MakeFromFileName("test.png"));= sk_sp .画布->画幅图像(img,.); 这样可以让SkImage::MakeFromEncoded()为您选择所有的格式。
这解决了这个问题。
https://stackoverflow.com/questions/47594400
复制相似问题