我正在使用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
我将引用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()为你做出有关格式的所有选择。
这解决了这个问题。
• 如何使用 OR-Tools Routing Library 为 CVRP 建模,其中车辆具有针对不同产品的多用途能力,不能混合使用?
• 如何让 pycharm 在 IDE 中更改 SQL 查询的颜色
• R 预测 stl 时的错误信息 no applicable method
• 价值与亮度
• SwiftUI - 在 .foregroundStyle 修饰符中使用 Color 或 LinearGradient
• Woocommerce 如何在目录可见性设置为隐藏时将产品设置为对特定用户/用户角色可见
• LinearGradient 在 P3 色彩空间(SwiftUI)中使用颜色时显示错误的颜色
• PowerShell 和 Winforms,试图将组合框的选择颜色更改为 DropDownList 和 OwnerDrawFixed