SkiaSharp 2.88.8 版本解读:SKImageFilter 兼容重载、裁剪安全与内部清理
图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载本文基于 SkiaSharp 官方仓库的版本发布说明 documentation/docfx/releases/2.88.8.md 编写结合该版本涉及的核心源码与测试进行深度解读。SkiaSharp 2.88.8发布于 2024 年 4 月 9 日是一次聚焦兼容性维护的版本一方面为SKImageFilter.Create*系列工厂方法补齐了兼容性重载另一方面让SKXamlCanvas与PlatformConfiguration在裁剪Trimming场景下更安全同时清理了原生绑定层的无效 extern 声明。读者读完本文后将能理解这些变更的破坏性影响范围、新 API 的用法与底层调用链以及在裁剪应用和 XAML 宿主环境中升级时需要注意的兼容点。版本概况与核心主题2.88.8 的发布说明以Trimming and compatibility overloads裁剪安全与兼容性重载作为主题整体包含四类变更Breaking Changes移除SKImageFilter.Create*系列方法尾部可选参数的 C# 默认值同时新增不带这些可选参数的伴随重载#2810API SurfaceSKImageFilter新增大量兼容性重载保证既有源码级调用无需改动即可继续编译Lifecycle InternalsPlatformConfiguration属性增加裁剪器注解#2734SKXamlCanvas不再使用async void#2731原生绑定不再为不存在的入口点声明 extern 函数#2710HarfBuzzSharp 7.3.0.2随附的 HarfBuzzSharp 同步发布主要包含 APIScan 与合规 YAML 清理API 表面无变化。对应的 API 差异详情可查阅 SkiaSharp API diff 与 HarfBuzzSharp API diff。Breaking ChangesSKImageFilter.Create* 默认参数被移除变更内容在 2.88.8 之前SKImageFilter.Create*系列工厂方法为尾部可选参数如input、cropRect提供了 C# 默认值 NULL。本版本将这些默认参数全部移除例如CreateAlphaThreshold、CreateArithmetic、CreateBlendMode、CreateBlur、CreateColorFilter、CreateDilate、CreateDisplacementMapEffectCreateDistantLitDiffuse/Specular、CreateDropShadow、CreateDropShadowOnly、CreateErode、CreateMagnifierCreateMatrixConvolution、CreateMerge、CreateOffset、CreatePaint、CreatePointLitDiffuse/Specular、CreateSpotLitDiffuse/Specular这些方法的尾部SKImageFilter input与SKImageFilter.CropRect cropRect或SKRect cropRect参数不再拥有默认值。API diff 文档 documentation/docfx/releases/2.88.8/SkiaSharp/SkiaSharp.md 中以 diff 形式记录了这一破坏性变更例如public SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKImageFilter input--- NULL---, SKImageFilter.CropRect cropRect--- NULL---) public SKImageFilter CreateDropShadow (float dx, float dy, float sigmaX, float sigmaY, SKColor color, SKImageFilter input--- NULL---, SKImageFilter.CropRect cropRect--- NULL---)影响范围由于参数默认值属于元数据层面的信息移除后会产生两类影响编译器层面的调用不受影响因为版本同时新增了不带可选参数的伴随重载源码中SKImageFilter.CreateBlur(5, 5)这类调用仍然能被编译器正确解析反射与动态调用可能受影响任何通过反射读取方法签名、或通过动态分发如dynamic、表达式树、序列化器调用这些方法且依赖默认参数补充尾参的代码都需要显式传入完整参数否则会出现MissingMethodException或参数缺失错误。这正是发布说明将其标记为Breaking的原因。升级建议普通源码调用无需改动直接升级即可反射/动态场景检查是否对SKImageFilter.Create*做过签名反射或动态调用若有请更新为显式传参二进制兼容如果以旧版本编译的第三方程序集直接引用这些工厂方法需要重新编译或联系上游更新。新增 API SurfaceSKImageFilter 兼容性重载为配合默认参数移除2.88.8 为SKImageFilter.Create*添加了一批新的重载同样记录于 API diff 的 Added methods 部分。这些重载覆盖了从最少参数到完整参数的各个组合例如public static SKImageFilter CreateBlur (float sigmaX, float sigmaY); public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKImageFilter input); public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKShaderTileMode tileMode); public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKImageFilter input, SKRect cropRect); public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKShaderTileMode tileMode, SKImageFilter input); public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKShaderTileMode tileMode, SKImageFilter input, SKRect cropRect);此外还新增了CreateMatrix (SKMatrix matrix)、CreateShader、CreateTile以及基于ReadOnlySpanT的CreateMatrixConvolution、CreateMerge等重载。源码中的重载实现仓库中 binding/SkiaSharp/SKImageFilter.cs 正是这些重载的实现现场。以CreateBlur为例全部重载最终收敛到带SKRect* cropRect的私有实现并调用原生入口SkiaApi.sk_imagefilter_new_blur// 最少参数重载内部补齐 tileMode/input/cropRect 的默认值 public static SKImageFilter CreateBlur (float sigmaX, float sigmaY) CreateBlur (sigmaX, sigmaY, SKShaderTileMode.Decal, null, null); // 带 tileMode 的重载 public static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKShaderTileMode tileMode, SKImageFilter? input, SKRect cropRect) CreateBlur (sigmaX, sigmaY, tileMode, input, cropRect); // 私有实现唯一真正调用 P/Invoke 的地方 private static SKImageFilter CreateBlur (float sigmaX, float sigmaY, SKShaderTileMode tileMode, SKImageFilter? input, SKRect* cropRect) { var filter GetObject (SkiaApi.sk_imagefilter_new_blur (sigmaX, sigmaY, tileMode, input?.Handle ?? IntPtr.Zero, cropRect)); GC.KeepAlive (input); return filter; }从源码结构可以看出几个值得注意的实现细节默认行为被显式化SKShaderTileMode.Decal是无 tileMode 重载时的默认边缘处理模式即裁剪区域之外的像素按透明处理input null表示直接作用于源位图内部通过input?.Handle ?? IntPtr.Zero将空引用转换为原生空指针GC.KeepAlive(input)保护托管引用确保原生调用期间输入过滤器不会被 GC 回收这是 SkiaSharp 对象生命周期管理的标准做法cropRect以指针传递SKRect作为ref struct风格的值类型通过cropRect取地址传入避免装箱分配。类似的模式同样出现在CreateDropShadow、CreateDropShadowOnly、CreateColorFilter、CreateDisplacementMapEffect、CreateMerge、CreateOffset、CreateMagnifier、CreatePaint等方法中。例如CreateDropShadow的私有实现调用SkiaApi.sk_imagefilter_new_drop_shadow (dx, dy, sigmaX, sigmaY, (uint)color, input?.Handle ?? IntPtr.Zero, cropRect)CreateMerge (first, second)则收敛到带SKRect*的私有实现。底层 P/Invoke 调用链所有工厂方法的原生入口集中在 binding/SkiaSharp/Generated/SkiaApi_include_c_sk_imagefilter_h.generated.cs。该文件为每个入口点生成三套实现通过条件编译切换USE_LIBRARY_IMPORT使用源生成的[LibraryImport]AOT/源码生成友好默认使用传统[DllImport]USE_DELEGATES通过GetSymbolT延迟解析符号并缓存委托支持从非默认位置加载原生库。例如// sk_imagefilter_t* sk_imagefilter_new_blur(float sigmaX, float sigmaY, sk_shader_tilemode_t tileMode, const sk_imagefilter_t* input, const sk_rect_t* cropRect) [LibraryImport (SKIA)] internal static partial sk_imagefilter_t sk_imagefilter_new_blur (Single sigmaX, Single sigmaY, SKShaderTileMode tileMode, sk_imagefilter_t input, SKRect* cropRect);过滤器创建完成后通过 binding/SkiaSharp/SKPaint.cs 的SKPaint.ImageFilter属性挂载到绘制画笔上再经由SKCanvas.DrawXxx生效形成工厂方法 → P/Invoke → 原生 Skia 图像过滤器 → 绘制管线的完整调用链。测试验证仓库测试 tests/Tests/SkiaSharp/SKImageFilterTest.cs 覆盖了这些工厂方法的关键行为可作为兼容性验证的参考MergeFilterAcceptsNullFilterArray/MergeFilterAcceptsNullParams验证CreateMerge可接受含null的过滤器数组或null参数CreateEmptyReturnsNonNull、CreateEmptyCanBeComposedWithOtherFilters验证CreateEmpty可参与CreateCompose组合CropFilterAcceptsNullInput、CropFilterComposesWithBlur验证CreateCrop的空输入与组合行为CropFilterWithDifferentTileModes验证Decal裁剪区外透明、Clamp边缘延伸、Repeat、Mirror四种 tile mode 的实际渲染语义CropFilterRendersCorrectly以 200×200 位图验证裁剪矩形内外像素的实际输出。这些测试证明新增重载不仅在签名层面可用其渲染语义也与既有行为完全一致。生命周期与内部改进PlatformConfiguration 裁剪安全注解#2734PlatformConfiguration位于 binding/Binding.Shared/PlatformConfiguration.cs是 SkiaSharp 与 HarfBuzzSharp 共享的平台探测类型通过HARFBUZZ条件编译切换命名空间到HarfBuzzSharp.Internals。它提供了一系列用于原生库加载决策的只读属性属性语义IsUnix是否为 Linux 或 macOSIsWindows是否运行于 WindowsIsMac是否运行于 macOSIsLinux是否运行于 LinuxIsArm进程架构是否为 ARM/ARM64Is64Bit进程是否为 64 位IntPtr.Size 8LinuxFlavorLinux 发行版风味标识如glibc/musl也支持 setter 手动覆盖IsGlibc当前 Linux 系统是否基于 glibc其实现依据目标框架做了分层在 .NET 6NET6_0_OR_GREATER上使用OperatingSystem.IsWindows()、OperatingSystem.IsMacOS()、OperatingSystem.IsLinux()等内置 API在旧框架上回退到RuntimeInformation.IsOSPlatform(...)IsGlibc通过 P/Invokegnu_get_libc_version探测若抛出TypeLoadException则判定为 musl 系UWP 特判分支直接使用Package.Current.Id.Architecture。2.88.8 中该类型的属性被补充裁剪注解trim annotations使 .NET 裁剪器Trimmer在发布裁剪应用时能够保留这些属性避免在运行时因裁剪导致平台探测失败、进而引发原生库加载错误。这是trim-friendly的核心含义。从当前仓库源码看这些属性普遍没有内联初始化分支之外的动态访问依赖适合被静态保留。升级到 2.88.8 后启用了PublishTrimmed的应用在启动阶段调用原生库加载逻辑时将不再因缺失这些属性而崩溃。SKXamlCanvas 移除 async void#2731SKXamlCanvas是 WinUI/UWP 平台上的 XAML 绘图画布源码位于 source/SkiaSharp.Views/SkiaSharp.Views.WinUI/SKXamlCanvas.cs。它的工作方式是通过PaintSurface事件或重写OnPaintSurface接收SKPaintSurfaceEventArgs在内部把绘制结果写入WriteableBitmap再用ImageBrush呈现到 XAML 画布上。在 2.88.8 之前画布的无效化Invalidate流程使用了async void风格的异步重绘。async void的缺点在于方法内抛出的异常无法被调用方捕获会直接冒泡到同步上下文通常导致进程级崩溃或静默丢失开发者在OnPaintSurface中抛出的绘制异常难以被观测和调试。2.88.8 将其移除改为通过DispatcherQueueWinUI或CoreDispatcherUWP以TryEnqueue/RunAsync排入普通优先级的重绘任务public void Invalidate() { #if WINDOWS DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, DoInvalidate); #else Dispatcher?.RunAsync(CoreDispatcherPriority.Normal, DoInvalidate); #endif }从当前源码可见重绘逻辑收敛到同步方法DoInvalidate它先检查设计模式与可见性再创建SKSurface绘制最后调用bitmap.Invalidate()刷新呈现。由于不再使用async void用户在OnPaintSurface/PaintSurface中抛出的异常能够在可观测的位置暴露方便定位问题。该控件还提供了CanvasSize、Dpi、IgnorePixelScaling等属性其中IgnorePixelScaling为true时画布按设备无关像素尺寸创建并在呈现时拉伸性能更好但可能出现模糊。无效 extern 不再生成#2710SkiaSharp 的原生绑定层通过工具从 C 头文件生成 P/Invoke 声明见 binding/SkiaSharp/Generated/ 下的SkiaApi_include_*.generated.cs。在部分平台上某些被声明的入口点实际不存在于原生库中导致链接/加载阶段对符号解析更严格的环境tighter loaders在加载 DLL 时失败。2.88.8 起绑定不再为不存在的入口点生成 extern 声明从而保证 DLL 在更严格的加载器下也能干净加载。从 SkiaApi_include_c_sk_imagefilter_h.generated.cs 可以看到每个入口点都按USE_LIBRARY_IMPORT/DllImport/ 委托三种模式条件编译这种结构保证了只声明真实存在的符号这一原则的可维护性。对使用LibraryImport或延迟符号解析的部署场景如 AOT、移动端、Wasm这一清理降低了启动期符号解析失败的风险。随附 HarfBuzzSharp 7.3.0.22.88.8 与 HarfBuzzSharp 7.3.0.2 一同发布。后者主要是随 SkiaSharp 维护周期同步进行的APIScan 与合规 YAML 清理其 API diff 文档 documentation/docfx/releases/harfbuzzsharp/7.3.0.2/HarfBuzzSharp/HarfBuzzSharp.md 明确标注No changes即该版本不包含任何公开 API 变更属于工程与合规层面的维护性发布。若项目同时引用SkiaSharp.HarfBuzz相关包随附升级即可无需修改任何 HarfBuzzSharp API 调用。Preview 1 与升级路径2.88.8 的完整功能最早以Preview 12024 年 4 月 4 日形态发布提前落地了四项核心变更SKImageFilter兼容性重载PlatformConfiguration上的裁剪注解SKXamlCanvas的async void修复无效 extern 清理。正式版在此基础上完成回归与打包。对于从 2.88.7 或更早版本升级的用户建议按以下顺序自查全局搜索SKImageFilter.Create的反射/动态调用优先更新为显式参数启用裁剪Trimming的应用验证PublishTrimmed后的启动与原生库加载WinUI/UWP 应用检查OnPaintSurface的异常处理路径确认异常能正常暴露随附升级 HarfBuzzSharp 至 7.3.0.2API 无变化风险极低。小结SkiaSharp 2.88.8 是一份典型的兼容性维护版本它以SKImageFilter默认参数移除为显式破坏点用成体系的伴随重载消除了对源码调用者的影响同时通过裁剪注解、async void清理与无效 extern 移除显著改善了裁剪应用、XAML 宿主与严格加载器场景下的运行时可靠性。对于关注 AOT/裁剪发布、WinUI 绘图异常可观测性以及动态调用兼容性的开发者该版本值得重点关注相关源码与测试均可从本文引用的仓库路径继续深入研读。赞分享图形学图像处理跨平台【免费下载链接】SkiaSharpSkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Googles Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.项目地址https://gitcode.com/gh_mirrors/sk/SkiaSharp点击查看免费下载相关推荐SkiaSharp 2.88.8 版本解析SKImageFilter 默认参数移除与兼容重载、裁剪优化与 XAML 画布改进SkiaSharp 2.88.8 版本解析SKImageFilter 默认参数移除与兼容重载、裁剪优化与 XAML 画布改进 本文以 SkiaSharp 2.图形学图像处理跨平台SkiaSharp 2.88.8 SKImageFilter API 重构解析默认参数移除与兼容重载迁移指南SkiaSharp 2.88.8 SKImageFilter API 重构解析默认参数移除与兼容重载迁移指南 SkiaSharp 2.88.8发布于 202图形学图像处理跨平台SkiaSharp 2.88.8 图像滤镜 API 升级指南SKImageFilter 重载重构与破坏性变更全解析SkiaSharp 2.88.8 图像滤镜 API 升级指南SKImageFilter 重载重构与破坏性变更全解析 本文基于仓库内 2.88.8 版本的官方图形学图像处理跨平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ROS Action通讯机制详解:长任务、进度反馈与取消控制的工程实践

ROS Action通讯机制详解:长任务、进度反馈与取消控制的工程实践

各位刚入坑 ROS 的朋友,学完 Topic 和 Service 之后,大概率都会遇到一个场景:想让机器人去做一件“会持续很久、中途还想看进度、万一不想要了还能取消”的任务,比如让机器人端着一摞盘子去洗,或者导航到某个房间再回来…

2026/10/16 18:29:39 阅读更多 →
三重教育阶段考试后如何跟进学习问题

三重教育阶段考试后如何跟进学习问题

三重教育阶段考试后如何跟进学习问题对于进入高三备考周期的学生来说,每一次阶段考试的核心价值从来不是给出一个分数排名,而是把前一阶段的学习盲区具象化,给后续的复习调整提供明确的方向。不少正在了解三重教育的高三家长,都会…

2026/10/16 18:29:35 阅读更多 →
先测试再动手:用vibecode-pro-max-kit可行性探针避免AI在错误假设上构建

先测试再动手:用vibecode-pro-max-kit可行性探针避免AI在错误假设上构建

【免费下载链接】vibecode-pro-max-kit Your AI forgets. This remembers. Spec-driven coding harness for vibecoders, product owners, CEOs and real builders — self-improving context memory, 15 agents, 33 skills working with /goal, agent-team, & workflow on…

2026/10/16 19:38:21 阅读更多 →

最新新闻

WorkBuddy 实战:10个高频技能让效率翻倍,从代码到自动化全落地

WorkBuddy 实战:10个高频技能让效率翻倍,从代码到自动化全落地

最近好几个朋友问我同一个问题:WorkBuddy 装好之后,到底应该从哪些技能开始用?网上一搜全是安装教程、基础配置,但真正能落地、能让人感觉“效率直接翻倍”的实践案例却很少。我把自己这段时间在真实项目里高频使用的 10 个 WorkB…

2026/10/17 6:13:35 阅读更多 →
CorsixTH:让1997年的医院模拟游戏跑上4K屏的开源引擎

CorsixTH:让1997年的医院模拟游戏跑上4K屏的开源引擎

CorsixTH:让1997年的医院模拟游戏跑上4K屏的开源引擎 【免费下载链接】CorsixTH Open source clone of Theme Hospital 项目地址: https://gitcode.com/GitHub_Trending/co/CorsixTH CorsixTH 是 1997 年 Bullfrog 商业模拟游戏《Theme Hospital》的完整重写…

2026/10/17 6:13:35 阅读更多 →
KMS托管密钥实现RDS数据加密与备份加密实践

KMS托管密钥实现RDS数据加密与备份加密实践

我直接说结论:如果你还在用“自建密钥应用层加解密”来保护数据库,多半已经在合规和运维的双重压力下吃到苦头了。这篇文章记录的是我落地“阿里云 KMS 托管密钥实现 RDS 数据加密与备份加密”这个项目的全过程,包括方案选型、原理拆解、实际…

2026/10/17 6:13:35 阅读更多 →
三级Linux真题2复盘:从命题规律到实战验证的备考指南

三级Linux真题2复盘:从命题规律到实战验证的备考指南

离考试还有三周的时候,我拿到了一套“计算机等级考试(三级Linux技术)真题2”。说实话,当时教材已经翻过一遍,自我感觉良好,结果第一遍做下来就被打回原形——单选错掉三分之一,多选几乎全军覆没…

2026/10/17 6:13:35 阅读更多 →
基于模型预测控制的混合储能微电网双层能量管理Matlab仿真全解析

基于模型预测控制的混合储能微电网双层能量管理Matlab仿真全解析

做微电网能量管理仿真的朋友,估计都有过这种体验:光伏和负荷曲线一波动,储能系统要么过充过放,要么功率分配失衡,运行成本算下来比想象的高出一截。这两年我一直在折腾基于模型预测算法的混合储能微电网双层能量管理系…

2026/10/17 6:13:35 阅读更多 →
Windsurf 实战:用 Cascade Agent 打造高效 AI 编程工作流

Windsurf 实战:用 Cascade Agent 打造高效 AI 编程工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 6:12:35 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →