【工业级油画生成工作流】:TensorRT加速部署+LoRA微调+油画纹理GAN增强,实测推理速度提升8.3倍(含GitHub开源代码)
更多请点击 https://codechina.net第一章AI生成油画画效果AI生成油画画效果正迅速成为数字艺术创作的重要范式它融合了深度学习、风格迁移与生成对抗网络GAN等前沿技术将普通照片或草图转化为具有厚重笔触、丰富肌理和典型油画质感的视觉作品。这类效果不仅服务于艺术家快速探索风格可能性也广泛应用于游戏原画、影视概念设计及个性化图像定制场景。核心技术原理实现油画效果的关键在于模拟传统油画的物理特性颜料堆叠、边缘模糊、笔触方向性与色彩混融。主流方法包括基于Neural Style TransferNST的多尺度特征匹配侧重内容保真与风格强度平衡使用AdaINAdaptive Instance Normalization实现快速风格迁移支持实时预览采用Diffusion模型微调专用LoRA权重精准复现梵高、莫奈等画家的笔触语义快速实践示例Stable Diffusion ControlNet以下命令使用diffusers库加载预训练油画LoRA在本地运行单张图像转换# 加载基础模型与油画LoRA from diffusers import StableDiffusionPipeline import torch pipe StableDiffusionPipeline.from_pretrained( runwayml/stable-diffusion-v1-5, torch_dtypetorch.float16, safety_checkerNone ).to(cuda) # 注入油画风格LoRA需提前下载并指定路径 pipe.unet.load_attn_procs(./lora/oil-painting-lora) # 生成提示词引导 prompt a portrait of a woman, oil painting style, thick impasto, visible brushstrokes, warm palette, museum quality image pipe(prompt, num_inference_steps30, guidance_scale7.5).images[0] image.save(oil_portrait.png)不同框架效果对比框架推理速度RTX 4090笔触可控性典型适用场景Stable Diffusion LoRA≈2.1s/图高通过ControlNet线稿引导创意设计、批量风格化DeepArt API≈8–12s/图云端中仅支持预设风格轻量级Web应用集成PyTorch NST自定义≈4.7s/图低需手动调参教学演示、算法研究第二章TensorRT加速部署核心技术解析与实操2.1 TensorRT图优化原理与ONNX模型转换实践图优化核心机制TensorRT通过层融合如ConvBNReLU、精度校准INT8量化感知和内核自动调优在ONNX解析后构建优化的引擎图。优化过程不改变语义仅提升推理吞吐与显存效率。ONNX到TensorRT转换示例import tensorrt as trt builder trt.Builder(logger) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) with open(model.onnx, rb) as f: parser.parse(f.read()) # 解析ONNX并映射为TRT计算图parser.parse()执行ONNX算子到TensorRT原语的映射EXPLICIT_BATCH标志启用显式批处理模式确保动态维度兼容性。关键优化策略对比策略作用适用场景层融合减少GPU kernel launch开销CNN主干网络权重压缩FP16/INT8量化降低显存占用边缘端部署2.2 动态shape支持与FP16/INT8量化校准全流程动态Shape适配机制现代推理引擎需在运行时处理变长序列或不同分辨率输入。TensorRT 8.6 通过OptimizationProfile支持多档动态维度范围auto profile builder-createOptimizationProfile(); profile-setDimensions(input, OptProfileSelector::MIN, Dims4{1,3,224,224}); profile-setDimensions(input, OptProfileSelector::OPT, Dims4{1,3,512,512}); profile-setDimensions(input, OptProfileSelector::MAX, Dims4{4,3,1024,1024}); config-addOptimizationProfile(profile);该配置声明了输入张量在 batch、height、width 上的合法区间引擎据此生成多组内核并自动调度。量化校准关键步骤选择校准数据集典型500–1000张代表性样本启用EMA统计激活值分布setCalibrationAlgo(QuantizationAlgo::kENTROPY_CALIBRATION_2)执行前向传播并收集各层最大激活幅值精度对比ResNet-50 on ImageNet精度类型Top-1 Acc (%)推理延迟 (ms)FP3276.212.4FP1676.17.8INT875.34.92.3 自定义插件开发油画风格感知层注入方法核心设计思想将油画纹理的高频边缘响应与CNN中间特征图耦合通过可学习的风格感知门控模块动态调制通道激活。关键代码实现class OilPaintingGate(nn.Module): def __init__(self, channels): super().__init__() self.conv nn.Conv2d(channels, channels, 1) self.norm nn.GroupNorm(8, channels) # 分组归一化稳定训练 self.sigmoid nn.Sigmoid() def forward(self, x): gate self.sigmoid(self.norm(self.conv(x))) return x * gate x * (1 - gate) * 0.3 # 主干保留风格增强残差该门控模块在ResNet第3个stage后插入channels需与对应特征图通道数一致0.3为油画质感衰减系数经网格搜索确定最优值。参数配置对照表参数默认值作用kernel_size1保持空间分辨率专注通道调制group_norm_groups8适配常见通道数64/128/2562.4 多GPU推理调度与CUDA流并发优化策略多GPU任务分片策略采用按batch维度横向切分结合NCCL AllReduce实现跨卡logits聚合。调度器依据GPU显存余量与计算负载动态分配子batch。CUDA流级并发控制cudaStream_t streams[4]; for (int i 0; i 4; i) { cudaStreamCreateWithFlags(streams[i], cudaStreamNonBlocking); } // 每卡绑定独立流避免隐式同步cudaStreamNonBlocking启用异步执行消除默认流的序列化瓶颈4个流对应4个并行推理pipeline阶段预处理→前向→后处理→输出。资源竞争规避机制显存池按GPU隔离禁止跨卡指针共享流间事件同步替代cudaDeviceSynchronize()2.5 工业级延迟/吞吐量压测与瓶颈定位工具链核心工具协同架构现代压测需多工具链联动上游用ghz或vegeta模拟高并发 HTTP/gRPC 请求中游通过OpenTelemetry Collector统一采集指标下游由Jaeger追踪链路、Prometheus Grafana可视化时序数据。典型压测配置示例vegeta attack -targetstargets.txt -rate1000/s -duration5m -outputresults.bin该命令以每秒1000请求速率持续压测5分钟-targets指向含URL与HTTP方法的文本文件results.bin为二进制结果支持后续用vegeta plot生成响应时间热力图。关键指标对比表工具适用场景延迟精度瓶颈定位能力Wrk2高吞吐HTTP基准μs级仅吞吐/延迟无链路追踪PyroscopeCPU/内存火焰图毫秒级采样精准定位热点函数第三章LoRA微调油画风格迁移的工程化实现3.1 油画数据集构建笔触密度标注与材质语义分割笔触密度图生成流程输入油画RGB图像 → Sobel梯度幅值计算 → 高斯加权局部方差归一化 → 密度热力图输出材质语义标签体系类别ID材质类型典型笔触特征0厚涂Impasto高凸起、边缘锐利、强高光1薄涂Glaze低对比、透明层叠、柔化边界标注工具核心函数def generate_stroke_density(img: np.ndarray, kernel_size15) - np.ndarray: # kernel_size控制感受野过大导致细节丢失过小引入噪声 grad cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize3) var_local cv2.blur(grad**2, (kernel_size, kernel_size)) return cv2.normalize(var_local, None, 0, 255, cv2.NORM_MINMAX)该函数通过局部方差量化笔触活跃度输出[0,255]密度图为后续语义分割提供弱监督信号。3.2 LoRA适配器设计通道注意力增强与梯度路由机制通道注意力增强模块在标准LoRA基础上引入轻量级SESqueeze-and-Excitation结构对低秩更新方向施加通道级权重调制class ChannelAttentionLoRA(nn.Module): def __init__(self, in_dim, r4): super().__init__() self.avg_pool nn.AdaptiveAvgPool2d(1) self.fc1 nn.Linear(in_dim, in_dim // r) self.fc2 nn.Linear(in_dim // r, in_dim) def forward(self, delta_w): # delta_w: [B, C, H, W] x self.avg_pool(delta_w).flatten(1) # squeeze x F.relu(self.fc1(x)) attn torch.sigmoid(self.fc2(x)).unsqueeze(-1).unsqueeze(-1) return delta_w * attn # excite: reweight per channel该模块不增加推理时参数量仅在训练中动态校准LoRA增量权重的通道重要性。梯度路由策略采用门控机制分离主干梯度与适配器梯度流路由路径梯度流向可训练参数主干路径∂L/∂Wbase冻结LoRA路径∂L/∂A, ∂L/∂BA/B矩阵 注意力FC层3.3 轻量级微调训练低秩更新混合精度梯度检查点实战低秩适配LoRA核心实现from peft import LoraConfig, get_peft_model lora_config LoraConfig( r8, # 低秩维度控制参数增量规模 lora_alpha16, # 缩放系数平衡原始权重与适配权重影响 target_modules[q_proj, v_proj], # 仅注入注意力层的特定投影 lora_dropout0.05 )该配置将全量微调参数量降低约95%仅新增约1.2M可训练参数显著缓解显存压力。三重优化协同策略混合精度启用AMP自动混合精度FP16前向FP32梯度累加梯度检查点以时间换空间减少中间激活内存占用约40%LoRA冻结主干权重冻结仅更新低秩增量矩阵显存与速度对比A100-40GB方案显存占用吞吐量tokens/s全参数微调38.2 GB42LoRAAMPCP11.7 GB68第四章油画纹理GAN增强模块深度集成4.1 纹理感知判别器设计高频笔触频域约束与LPIPS对齐频域约束模块通过FFT提取生成图像的高频分量施加谱损失约束笔触细节保真度def spectral_loss(real_fft, fake_fft, weight_map): # weight_map: 高频区域增强掩码如|freq| 0.3时设为2.0 return torch.mean(weight_map * torch.abs(real_fft - fake_fft))该函数对傅里叶幅值差加权求均值突出边缘与纹理区域惩罚避免低频主导梯度淹没。LPIPS对齐机制冻结预训练AlexNet特征提取器在relu4_2层计算感知距离与GAN损失联合反向传播多尺度判别响应对比尺度高频权重LPIPS贡献比64×641.80.32128×1281.20.47256×2560.90.614.2 多尺度风格迁移损失函数梵高/伦勃朗/莫奈特征解耦建模风格特征解耦原理通过预训练VGG-19的多层特征图relu1_2、relu2_2、relu3_3、relu4_3分别捕获纹理、笔触、结构与氛围层级。梵高对应强方向性高频激活伦勃朗侧重低频明暗对比莫奈则体现中频色彩弥散。损失函数构成内容重建损失约束高层语义一致性relu4_3风格解耦损失按艺术家定制Gram矩阵加权项尺度归一化项防止深层特征主导梯度更新艺术家专属权重配置艺术家relu2_2relu3_3relu4_3梵高0.81.20.5伦勃朗1.00.60.9莫奈0.71.50.3def artist_weighted_gram_loss(feat, artistvan_gogh): weights {van_gogh: [0.8, 1.2, 0.5], rembrandt: [1.0, 0.6, 0.9], monet: [0.7, 1.5, 0.3]} gram_losses [gram_matrix(f)**2 for f in feat] # feat[f2,f3,f4] return sum(w * l for w, l in zip(weights[artist], gram_losses))该函数对三层特征图分别计算Gram矩阵二范数并按艺术家特性加权求和权重经消融实验确定确保笔触f2、结构f3、全局氛围f4贡献比例符合艺术史分析结论。4.3 GAN与扩散主干协同推理隐空间纹理注入与残差融合架构隐空间对齐策略为实现GAN生成器与扩散模型U-Net主干的无缝协作需在潜在空间建立双向映射。关键在于将GAN的$z$向量经非线性投影后与扩散模型中间层的特征图进行通道对齐。残差融合模块设计# 隐空间纹理注入层PyTorch实现 class TextureInjection(nn.Module): def __init__(self, in_channels, z_dim512): super().__init__() self.proj_z nn.Linear(z_dim, in_channels) # 将噪声向量映射至特征通道数 self.gamma nn.Parameter(torch.ones(in_channels)) # 可学习缩放系数 self.beta nn.Parameter(torch.zeros(in_channels)) # 可学习偏移项 def forward(self, x, z): # x: [B, C, H, W], z: [B, z_dim] z_proj self.proj_z(z).view(-1, x.size(1), 1, 1) # [B, C, 1, 1] return x self.gamma * z_proj self.beta该模块将GAN生成的语义先验以仿射变换形式注入扩散主干的跳跃连接处其中gamma与beta实现动态归一化校准避免模态间分布偏移。协同推理流程GAN编码器提取输入草图的结构先验输出隐向量$z$扩散主干在去噪步中在第2、4、6个ResBlock后调用TextureInjection模块最终输出融合了GAN高频纹理与扩散模型全局一致性的高保真图像4.4 纹理增强后处理流水线边缘保真度修复与色彩一致性校正边缘保真度修复策略采用双边滤波引导的残差补偿机制在高频纹理区域抑制过锐化伪影。核心操作如下# 输入增强图 img_enh, 原图 img_orig, 边缘掩膜 edge_mask residual cv2.bilateralFilter(img_enh - img_orig, d9, sigmaColor75, sigmaSpace75) img_fixed np.clip(img_orig residual * edge_mask, 0, 255)该代码通过双边滤波约束残差空间σColor75确保色彩梯度敏感d9适配常见纹理尺度edge_mask由Canny形态学闭运算生成仅在|∇I| 12处激活补偿。色彩一致性校正流程在Lab空间对a*、b*通道进行直方图匹配约束L*通道Gamma校正斜率∈[0.92, 1.08]全局色差ΔEab≤ 2.3CIE76标准性能对比PSNR/SSIM方法PSNR (dB)SSIM原始增强32.10.872本流水线34.60.918第五章总结与展望在真实生产环境中微服务架构的可观测性建设已从“可选”变为“必需”。某电商中台团队通过将 OpenTelemetry SDK 嵌入 Go 微服务统一采集 traces、metrics 和 logs并对接 Grafana Loki 与 Tempo使平均故障定位时间MTTR从 47 分钟降至 8.3 分钟。采用语义约定Semantic Conventions规范 span 属性命名确保跨语言链路数据一致性通过采样策略动态调整 trace 上报率在高流量时段启用头部采样Head-based Sampling兼顾性能与诊断精度将关键业务路径如订单创建、库存扣减标记为span.WithAttributes(semconv.HTTPRouteKey.String(/api/v1/order))func instrumentOrderCreate(ctx context.Context, order *Order) (err error) { ctx, span : tracer.Start(ctx, order.create, trace.WithSpanKind(trace.SpanKindServer)) defer func() { span.End(tracing.WithError(err)) }() // 添加业务上下文标签 span.SetAttributes( semconv.HTTPMethodKey.String(POST), attribute.String(order.currency, order.Currency), attribute.Int64(order.amount_cents, order.AmountCents), ) return processOrder(ctx, order) }指标类型采集方式典型阈值告警HTTP 5xx 错误率Prometheus otel-collector metrics exporter0.5% 持续 2 分钟DB 查询 P99 延迟OTLP Exporter pg_stat_statements 集成1200ms→ [Service A] → (HTTP/1.1) → [Auth Gateway] → (gRPC) → [Order Service] ↓ [Payment Service] ← (async Kafka event)未来半年该团队计划将 eBPF 探针集成至 Kubernetes DaemonSet实现零代码侵入的网络层延迟观测并验证 OpenTelemetry Collector 的无损压缩 pipeline 在万级 RPS 下的吞吐稳定性。

相关新闻

不止对话交互!深挖 OpenClaw 2.7.9 本地设备自主任务执行能力

不止对话交互!深挖 OpenClaw 2.7.9 本地设备自主任务执行能力

🔥前言:Win11 环境运行 OpenClaw 必读说明 OpenClaw(因其图标形似小龙虾,在社区中常被昵称为“小龙虾”)是一款备受关注的本地优先 AI 智能体项目。它基于开源协议开发,能够通过自然语言指令驱动计算机完成…

2026/10/11 20:28:13 阅读更多 →
SPT-AKI存档编辑器:离线版逃离塔科夫终极自定义指南

SPT-AKI存档编辑器:离线版逃离塔科夫终极自定义指南

SPT-AKI存档编辑器:离线版逃离塔科夫终极自定义指南 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/sp/…

2026/10/11 1:15:00 阅读更多 →
边缘 AI 开发者 2026 下半年技能图谱:从模型训练到端侧部署的完整能力树构建

边缘 AI 开发者 2026 下半年技能图谱:从模型训练到端侧部署的完整能力树构建

边缘 AI 开发者 2026 下半年技能图谱:从模型训练到端侧部署的完整能力树构建 一、边缘 AI 开发者的能力光谱 边缘 AI 开发是一个跨学科领域——它与纯后端开发、纯嵌入式开发、纯算法研究都有交集,但又是这三个领域的并集而非交集。一个合格的边缘 AI …

2026/10/11 20:28:17 阅读更多 →

最新新闻

代码级对抗攻击:AST扰动如何绕过SAST与CI门禁

代码级对抗攻击:AST扰动如何绕过SAST与CI门禁

1. 这不是“黑客炫技”,而是代码层攻防的日常切片“Code-Level Adversarial Attacks 相关工作”——看到这个标题,很多人第一反应是:又一个AI安全论文里的抽象概念?其实不然。它背后是一群人在真实代码世界里反复拆解、注入、绕过…

2026/10/12 5:44:22 阅读更多 →
自然数立方与连续奇数之和:推导证明与Python验证

自然数立方与连续奇数之和:推导证明与Python验证

任何一个自然数 m,它的立方都可以写成 m 个连续奇数之和。这句话我第一次读到时,第一反应是:真的假的?当时正好在翻等差数列求和公式,索性拿纸笔列了一串奇数:1、3、5、7、9、11、13、15、17、19、21……然…

2026/10/12 5:44:22 阅读更多 →
最新Nessus2026.10.8版本主机漏洞扫描/探测工具Windows/Linux

最新Nessus2026.10.8版本主机漏洞扫描/探测工具Windows/Linux

前言 Nessus号称是世界上最流行的扫描程序,全世界有超过75000个组织在使用它。该工具提供完整的电脑扫描服务,并随时更新其数据库。Nessus不同于传统的扫描软件,Nessus可同时在本机或远端上遥控,进行系统的分析扫描。对应渗透测试…

2026/10/12 5:44:22 阅读更多 →
psutil详解:用Python搞定CPU、内存与进程监控

psutil详解:用Python搞定CPU、内存与进程监控

前阵子公司一台线上服务CPU突然飙到100%,我用系统自带的任务管理器看了半天,除了一个pid能锁定,剩下的信息全靠猜。后来发现这个进程是哪个服务的、占了多少内存、网络连了哪里,全是黑盒。那次之后我花了两天把psutil完整过了一遍…

2026/10/12 5:44:22 阅读更多 →
编程循环控制核心:break与continue用法详解与多语言实战对比

编程循环控制核心:break与continue用法详解与多语言实战对比

做开发这几年,几乎每个项目里都会碰上循环控制的问题。for 循环本身很简单,真正让新手挠头、让老手翻车的,往往是循环体里的那两个关键字:break 和 continue。很多新手写循环,要么不敢用 break 导致白白跑完全部数据&a…

2026/10/12 5:44:22 阅读更多 →
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升

2026年10月10日,mediamtx 发布 v1.21.2 最新版本。本次更新以“修复与改进”为主,覆盖通用逻辑、API、Media-Over-QUIC、RTSP、RTMP、HLS、WebRTC 以及依赖库升级等多个方向。 v1.21.2 没有引入新的功能模块,而是集中处理实际运行中可能出现的…

2026/10/12 5:43:21 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →