HarmonyOS开发:SVG滤镜效果与图像处理

举报
Jack20 发表于 2026/06/22 22:23:29 2026/06/22
【摘要】 HarmonyOS开发:SVG滤镜效果与图像处理核心要点:深入掌握SVG滤镜体系,从feGaussianBlur到feTurbulence,学会用滤镜原语组合出丰富视觉效果,打造专业级图像处理能力。 一、背景与动机你有没有想过,为什么有些应用的界面看起来特别"高级"?按钮有柔和的投影,卡片有磨砂玻璃效果,背景有流动的噪声纹理……这些效果如果用传统方式实现,要么需要大量图片资源,要么得写复杂...

HarmonyOS开发:SVG滤镜效果与图像处理

核心要点:深入掌握SVG滤镜体系,从feGaussianBlur到feTurbulence,学会用滤镜原语组合出丰富视觉效果,打造专业级图像处理能力。


一、背景与动机

你有没有想过,为什么有些应用的界面看起来特别"高级"?按钮有柔和的投影,卡片有磨砂玻璃效果,背景有流动的噪声纹理……这些效果如果用传统方式实现,要么需要大量图片资源,要么得写复杂的Shader代码。但如果用SVG滤镜,几行声明式代码就能搞定。

SVG滤镜就像是一个"图像处理流水线"——你把原始图形丢进去,经过一道道工序(模糊、变色、合成、噪声……),最后输出一个焕然一新的结果。它不需要你理解卷积核的数学原理,也不需要你手写像素级操作代码,只需要像搭积木一样组合各种滤镜原语。

在HarmonyOS中,SVG滤镜不仅可以应用于SVG图形本身,还可以通过Image组件的filter属性应用于任意图片,甚至可以给整个组件容器加上滤镜效果。这就意味着,你可以在不引入任何图片资源的前提下,实现毛玻璃、霓虹灯、油画、素描等几十种视觉效果。

不过说实话,SVG滤镜的学习曲线确实有点陡——那些 fe 开头的标签名看着就让人头大。别急,今天我们就把每个滤镜原语都拆解清楚,让你真正理解它们的工作原理和组合方式。


二、核心原理

2.1 SVG滤镜工作流

SVG滤镜的核心概念是滤镜原语(Filter Primitive)。每个原语接收输入图像,执行特定的图像处理操作,输出处理后的图像。多个原语通过 inresult 属性串联,形成处理流水线。

graph LR
    A[SourceGraphic<br>原始图形]:::primary --> B[feGaussianBlur<br>高斯模糊]:::info
    C[SourceAlpha<br>透明度通道]:::warning --> D[feOffset<br>偏移]:::info
    B --> E[feComposite<br>合成]:::error
    D --> E
    E --> F[feMerge<br>合并输出]:::primary
    A --> F
    
    classDef primary fill:#4CAF50,stroke:#388E3C,color:#fff
    classDef warning fill:#FF9800,stroke:#F57C00,color:#fff
    classDef error fill:#F44336,stroke:#D32F2F,color:#fff
    classDef info fill:#2196F3,stroke:#1976D2,color:#fff

2.2 滤镜输入输出模型

每个滤镜原语有两个关键属性:

  • in:指定输入图像,可以是内置关键字或前一个原语的 result
  • result:给输出图像命名,供后续原语引用

内置输入关键字:

  • SourceGraphic:原始图形(含颜色和透明度)
  • SourceAlpha:原始图形的透明度通道(颜色为白色,透明度与原图一致)
  • BackgroundImage:背景图像(需启用 enable-background
  • FillPaint / StrokePaint:填充/描边颜色

2.3 滤镜区域与分辨率

<filter> 元素的关键属性:

  • filterUnits:定义滤镜区域的坐标系(objectBoundingBoxuserSpaceOnUse
  • primitiveUnits:定义原语属性的坐标系
  • x/y/width/height:滤镜作用区域,默认为 -10%/-10%/120%/120%(比图形稍大,容纳模糊溢出)
  • filterRes:滤镜分辨率,值越大效果越精细但性能越差

三、代码实战

3.1 基础用法:feGaussianBlur高斯模糊

高斯模糊是最常用的滤镜原语,它通过高斯函数对像素进行加权平均,产生平滑的模糊效果。

// 在HarmonyOS中使用SVG滤镜
@Entry
@Component
struct GaussianBlurDemo {
  build() {
    Column({ space: 20 }) {
      Text('feGaussianBlur 高斯模糊')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)

      // 原始图形
      Row({ space: 16 }) {
        Column() {
          Text('原始')
            .fontSize(14)
            .margin({ bottom: 8 })
          // 无滤镜的圆形
          Circle()
            .width(100)
            .height(100)
            .fill('#3498db')
        }

        Column() {
          Text('轻度模糊')
            .fontSize(14)
            .margin({ bottom: 8 })
          // 应用高斯模糊滤镜
          Circle()
            .width(100)
            .height(100)
            .fill('#3498db')
            .filter(`blur(3px)`)
        }

        Column() {
          Text('重度模糊')
            .fontSize(14)
            .margin({ bottom: 8 })
          Circle()
            .width(100)
            .height(100)
            .fill('#3498db')
            .filter(`blur(10px)`)
        }
      }

      // 使用SVG定义更精细的模糊控制
      Svg({ width: 300, height: 200 }) {
        // 定义滤镜
        Defs() {
          Filter({ id: 'softBlur' })
            // stdDeviation: 模糊标准差,值越大越模糊
            // 可以分别指定x和y方向的模糊值
            FeGaussianBlur({ stdDeviation: 4, in: 'SourceGraphic' })
        }
        // 应用滤镜的矩形
        Rect()
          .width(120)
          .height(80)
          .x(90)
          .y(60)
          .fill('#e74c3c')
          .rx(12)
          .ry(12)
          .filter('url(#softBlur)')
      }
    }
    .padding(20)
  }
}

3.2 进阶用法:feColorMatrix颜色矩阵与feComposite合成

颜色矩阵是SVG滤镜中最强大的原语之一,它通过4×5矩阵对RGBA通道进行线性变换,可以实现色调调整、灰度化、反色、通道分离等效果。

// 颜色矩阵与合成操作
@Entry
@Component
struct ColorMatrixDemo {
  // 预定义颜色矩阵
  private matrices: Record<string, number[]> = {
    // 灰度化矩阵
    grayscale: [
      0.2126, 0.7152, 0.0722, 0, 0,
      0.2126, 0.7152, 0.0722, 0, 0,
      0.2126, 0.7152, 0.0722, 0, 0,
      0, 0, 0, 1, 0
    ],
    // 棕褐色调(怀旧效果)
    sepia: [
      0.393, 0.769, 0.189, 0, 0,
      0.349, 0.686, 0.168, 0, 0,
      0.272, 0.534, 0.131, 0, 0,
      0, 0, 0, 1, 0
    ],
    // 反色
    invert: [
      -1, 0, 0, 0, 1,
      0, -1, 0, 0, 1,
      0, 0, -1, 0, 1,
      0, 0, 0, 1, 0
    ],
    // 亮度增强
    brightness: [
      1.5, 0, 0, 0, 0,
      0, 1.5, 0, 0, 0,
      0, 0, 1.5, 0, 0,
      0, 0, 0, 1, 0
    ]
  };

  build() {
    Scroll() {
      Column({ space: 20 }) {
        Text('feColorMatrix 颜色矩阵')
          .fontSize(20)
          .fontWeight(FontWeight.Bold)

        // 使用SVG实现颜色矩阵效果
        Svg({ width: '100%', height: 500 }) {
          Defs() {
            // 灰度滤镜
            Filter({ id: 'grayscale' })
              .FeColorMatrix({
                type: 'matrix',
                values: this.matrices.grayscale.join(' '),
                in: 'SourceGraphic'
              })

            // 棕褐色调滤镜
            Filter({ id: 'sepia' })
              .FeColorMatrix({
                type: 'matrix',
                values: this.matrices.sepia.join(' '),
                in: 'SourceGraphic'
              })

            // 投影效果:模糊 + 偏移 + 合成
            Filter({ id: 'dropShadow', x: '-20%', y: '-20%', width: '140%', height: '140%' })
              .FeGaussianBlur({
                stdDeviation: 5,
                in: 'SourceAlpha',
                result: 'blur'
              })
              .FeOffset({
                dx: 6,
                dy: 6,
                in: 'blur',
                result: 'offsetBlur'
              })
              .FeFlood({
                floodColor: '#000000',
                floodOpacity: 0.3,
                result: 'shadowColor'
              })
              .FeComposite({
                in2: 'offsetBlur',
                operator: 'in',
                in: 'shadowColor',
                result: 'shadow'
              })
              .FeMerge()
              .FeMergeNode({ in: 'shadow' })
              .FeMergeNode({ in: 'SourceGraphic' })
          }

          // 原始图形
          Rect()
            .width(80)
            .height(80)
            .x(20)
            .y(20)
            .fill('#2ecc71')
            .rx(8)
            .ry(8)

          // 灰度化
          Rect()
            .width(80)
            .height(80)
            .x(120)
            .y(20)
            .fill('#2ecc71')
            .rx(8)
            .ry(8)
            .filter('url(#grayscale)')

          // 棕褐色调
          Rect()
            .width(80)
            .height(80)
            .x(220)
            .y(20)
            .fill('#2ecc71')
            .rx(8)
            .ry(8)
            .filter('url(#sepia)')

          // 投影效果
          Rect()
            .width(120)
            .height(80)
            .x(90)
            .y(160)
            .fill('#3498db')
            .rx(12)
            .ry(12)
            .filter('url(#dropShadow)')

          // 文字也支持滤镜
          Text('SVG滤镜文字')
            .x(60)
            .y(300)
            .fontSize(32)
            .fill('#e74c3c')
            .fontWeight(FontWeight.Bold)
            .filter('url(#dropShadow)')
        }
      }
      .padding(20)
    }
  }
}

3.3 完整示例:SVG滤镜组合与自定义滤镜

这个示例展示了如何组合多个滤镜原语,实现毛玻璃、霓虹灯、油画等高级效果:

@Entry
@Component
struct FilterComboDemo {
  @State currentFilter: string = 'none';

  build() {
    Column() {
      // 滤镜选择器
      Row({ space: 8 }) {
        ForEach([
          { name: '无滤镜', key: 'none' },
          { name: '毛玻璃', key: 'frosted' },
          { name: '霓虹灯', key: 'neon' },
          { name: '浮雕', key: 'emboss' },
          { name: '油画', key: 'oilPaint' }
        ], (item: { name: string; key: string }) => {
          Button(item.name)
            .fontSize(13)
            .fontColor(this.currentFilter === item.key ? '#ffffff' : '#333333')
            .backgroundColor(this.currentFilter === item.key ? '#3498db' : '#e8e8e8')
            .borderRadius(16)
            .onClick(() => {
              this.currentFilter = item.key;
            })
        }
        )
      }
      .padding(12)

      // 滤镜效果展示区
      Scroll() {
        Column({ space: 24 }) {
          // 毛玻璃效果
          if (this.currentFilter === 'frosted' || this.currentFilter === 'none') {
            this.FrostedGlassCard()
          }

          // 霓虹灯效果
          if (this.currentFilter === 'neon' || this.currentFilter === 'none') {
            this.NeonTextCard()
          }

          // 浮雕效果
          if (this.currentFilter === 'emboss' || this.currentFilter === 'none') {
            this.EmbossCard()
          }

          // 油画效果
          if (this.currentFilter === 'oilPaint' || this.currentFilter === 'none') {
            this.OilPaintCard()
          }
        }
        .padding(16)
      }
      .layoutWeight(1)
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#f0f0f0')
  }

  // 毛玻璃效果卡片
  @Builder
  FrostedGlassCard() {
    Column() {
      Text('毛玻璃效果')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 8 })
      Text('通过feGaussianBlur + feComposite实现')
        .fontSize(13)
        .fontColor('#666666')

      Svg({ width: '100%', height: 200 }) {
        Defs() {
          // 毛玻璃滤镜:模糊背景 + 与前景合成
          Filter({ id: 'frostedGlass', x: '-10%', y: '-10%', width: '120%', height: '120%' })
            .FeGaussianBlur({
              stdDeviation: 8,
              in: 'SourceGraphic',
              result: 'blurred'
            })
            .FeColorMatrix({
              type: 'matrix',
              values: '1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 0.7 0',
              in: 'blurred',
              result: 'dimmed'
            })
        }

        // 背景色块
        Rect()
          .width('100%')
          .height(200)
          .fill('#3498db')

        // 彩色装饰圆
        Circle().cx(80).cy(60).r(40).fill('#e74c3c')
        Circle().cx(250).cy(140).r(50).fill('#2ecc71')
        Circle().cx(160).cy(100).r(30).fill('#f1c40f')

        // 毛玻璃覆盖层
        Rect()
          .width('80%')
          .height(80)
          .x('10%')
          .y(60)
          .fill('#ffffff')
          .fillOpacity(0.3)
          .rx(12)
          .ry(12)
          .filter('url(#frostedGlass)')

        Text('Frosted Glass')
          .x('25%')
          .y(82)
          .fontSize(22)
          .fill('#ffffff')
          .fontWeight(FontWeight.Bold)
      }
    }
    .padding(16)
    .backgroundColor('#ffffff')
    .borderRadius(16)
  }

  // 霓虹灯效果
  @Builder
  NeonTextCard() {
    Column() {
      Text('霓虹灯效果')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 8 })
      Text('多层模糊叠加实现发光效果')
        .fontSize(13)
        .fontColor('#666666')

      Svg({ width: '100%', height: 180 }) {
        Defs() {
          // 霓虹灯滤镜:多层模糊叠加
          Filter({ id: 'neonGlow', x: '-50%', y: '-50%', width: '200%', height: '200%' })
            // 第一层:强模糊(外发光)
            .FeGaussianBlur({
              stdDeviation: 6,
              in: 'SourceGraphic',
              result: 'blur1'
            })
            // 第二层:弱模糊(内发光)
            .FeGaussianBlur({
              stdDeviation: 2,
              in: 'SourceGraphic',
              result: 'blur2'
            })
            // 合并发光层
            .FeMerge()
            .FeMergeNode({ in: 'blur1' })
            .FeMergeNode({ in: 'blur2' })
            .FeMergeNode({ in: 'SourceGraphic' })
        }

        // 深色背景
        Rect()
          .width('100%')
          .height(180)
          .fill('#1a1a2e')

        // 霓虹文字
        Text('NEON')
          .x('22%')
          .y(50)
          .fontSize(48)
          .fill('#00ff88')
          .fontWeight(FontWeight.Bold)
          .fontFamily('monospace')
          .filter('url(#neonGlow)')

        // 第二行霓虹
        Text('GLOW')
          .x('25%')
          .y(100)
          .fontSize(48)
          .fill('#ff0066')
          .fontWeight(FontWeight.Bold)
          .fontFamily('monospace')
          .filter('url(#neonGlow)')
      }
    }
    .padding(16)
    .backgroundColor('#ffffff')
    .borderRadius(16)
  }

  // 浮雕效果
  @Builder
  EmbossCard() {
    Column() {
      Text('浮雕效果')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 8 })
      Text('feConvolveMatrix卷积核实现浮雕纹理')
        .fontSize(13)
        .fontColor('#666666')

      Svg({ width: '100%', height: 180 }) {
        Defs() {
          // 浮雕滤镜:使用卷积矩阵
          Filter({ id: 'emboss' })
            .FeConvolveMatrix({
              order: 3,
              kernelMatrix: '-2 -1 0  -1 1 1  0 1 2',
              in: 'SourceGraphic'
            })
        }

        Rect()
          .width(140)
          .height(100)
          .x(30)
          .y(40)
          .fill('#8e44ad')
          .rx(12)
          .ry(12)

        // 应用浮雕效果
        Rect()
          .width(140)
          .height(100)
          .x(190)
          .y(40)
          .fill('#8e44ad')
          .rx(12)
          .ry(12)
          .filter('url(#emboss)')
      }
    }
    .padding(16)
    .backgroundColor('#ffffff')
    .borderRadius(16)
  }

  // 油画效果
  @Builder
  OilPaintCard() {
    Column() {
      Text('油画效果')
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 8 })
      Text('feTurbulence噪声 + feDisplacementMap位移实现')
        .fontSize(13)
        .fontColor('#666666')

      Svg({ width: '100%', height: 200 }) {
        Defs() {
          // 油画滤镜:噪声扰动
          Filter({ id: 'oilPainting' })
            .FeTurbulence({
              type: 'fractalNoise',
              baseFrequency: '0.02',
              numOctaves: 3,
              seed: 42,
              result: 'noise'
            })
            .FeDisplacementMap({
              in: 'SourceGraphic',
              in2: 'noise',
              scale: 8,
              xChannelSelector: 'R',
              yChannelSelector: 'G'
            })
        }

        // 原始风景色块
        Rect()
          .width(140)
          .height(160)
          .x(20)
          .y(20)
          .fill('#87ceeb')

        Ellipse()
          .cx(90)
          .cy(50)
          .rx(30)
          .ry(20)
          .fill('#f1c40f')

        Rect()
          .width(140)
          .height(60)
          .x(20)
          .y(120)
          .fill('#2ecc71')

        // 应用油画效果
        G().filter('url(#oilPainting)') {
          Rect()
            .width(140)
            .height(160)
            .x(190)
            .y(20)
            .fill('#87ceeb')

          Ellipse()
            .cx(260)
            .cy(50)
            .rx(30)
            .ry(20)
            .fill('#f1c40f')

          Rect()
            .width(140)
            .height(60)
            .x(190)
            .y(120)
            .fill('#2ecc71')
        }
      }
    }
    .padding(16)
    .backgroundColor('#ffffff')
    .borderRadius(16)
  }
}

四、踩坑与注意事项

坑点1:滤镜区域裁切导致效果不完整

<filter> 默认的作用区域是 -10%/-10%/120%/120%,这意味着模糊等溢出效果可能被裁切。特别是 stdDeviation 较大时,模糊边缘会被硬切。解决方案:手动设置更大的滤镜区域,如 x="-50%" y="-50%" width="200%" height="200%"

坑点2:feColorMatrix的values格式要求严格

feColorMatrixvalues 属性必须是20个数字,用空格或逗号分隔。矩阵是按行排列的4×5矩阵,但很多人会误写成5×4。记住:每行5个值(R/G/B/A/Offset),共4行,总共20个值。少一个多一个都会导致滤镜失效。

坑点3:feTurbulence的baseFrequency范围

baseFrequency 的值通常在0.01~1之间。值太小(如0.001)生成的噪声图案会非常大,几乎看不到细节;值太大(如10)则会产生纯色块。建议:从0.02开始调试,逐步增减。另外,baseFrequency 可以分别指定x和y方向的频率(用空格分隔),实现拉伸效果。

坑点4:feComposite的operator语义

feCompositeoperator 有六种取值:overinoutatopxorarithmetic。最容易搞混的是 inatop

  • in:只保留两图像重叠部分,且使用前景图像的颜色
  • atop:保留背景图像,但只在重叠区域显示前景颜色

做投影效果时用 in:先flood一个颜色,再与模糊后的Alpha通道 in 合成,就得到了指定颜色的投影。

坑点5:滤镜性能问题

SVG滤镜是CPU密集型操作,尤其是 feGaussianBlurstdDeviation 超过10时,或者 feTurbulencenumOctaves 超过4时,性能会急剧下降。在移动端stdDeviation 建议不超过8,numOctaves 建议不超过3。如果需要更强的模糊效果,考虑用多层低模糊叠加代替单层高模糊。

坑点6:filter属性引用路径

在HarmonyOS的SVG中使用 filter='url(#filterId)' 引用滤镜时,确保 Defs 中的 Filterid 值与引用完全一致,包括大小写。另外,url(#...) 中的 # 不能省略,否则滤镜不会生效。


五、HarmonyOS 6适配说明

API差异

API HarmonyOS 5.0 HarmonyOS 6.0 迁移建议
Filter组件 基础滤镜原语支持 新增feDropShadow便捷原语 投影效果可直接使用feDropShadow替代手动组合
FeTurbulence 基础噪声生成 新增stitchTiles属性 拼接平铺噪声效果更自然
FeConvolveMatrix 基础卷积支持 新增bias属性 可调整卷积结果偏移量,浮雕效果更可控
filter CSS属性 支持blur/drop-shadow 新增hue-rotate/saturate/invert 可直接用CSS filter实现简单效果,无需SVG
SVG滤镜硬件加速 软件渲染 部分原语硬件加速 stdDeviation≤8的模糊已硬件加速

行为变更

  • 滤镜缓存机制:HarmonyOS 6.0引入了滤镜结果缓存,相同参数的滤镜不会重复计算。但如果滤镜参数动态变化(如动画中),缓存反而会增加开销,可通过 filterRes 降低分辨率来优化
  • feDropShadow新增:6.0新增了 feDropShadow 便捷原语,一行代码即可实现投影效果,无需手动组合feGaussianBlur + feOffset + feFlood + feComposite
  • CSS filter扩展:6.0中组件的 filter 属性支持更多CSS滤镜函数,简单效果无需定义SVG滤镜

适配代码

// HarmonyOS 6适配:使用feDropShadow简化投影
Svg({ width: 300, height: 200 }) {
  Defs() {
    // HarmonyOS 5.0写法:手动组合(仍然兼容)
    Filter({ id: 'shadowOld' })
      .FeGaussianBlur({ stdDeviation: 5, in: 'SourceAlpha', result: 'blur' })
      .FeOffset({ dx: 4, dy: 4, in: 'blur', result: 'offsetBlur' })
      .FeFlood({ floodColor: '#000000', floodOpacity: 0.25, result: 'color' })
      .FeComposite({ in: 'color', in2: 'offsetBlur', operator: 'in', result: 'shadow' })
      .FeMerge()
      .FeMergeNode({ in: 'shadow' })
      .FeMergeNode({ in: 'SourceGraphic' })

    // HarmonyOS 6.0写法:一行搞定
    Filter({ id: 'shadowNew' })
      .FeDropShadow({
        dx: 4,
        dy: 4,
        stdDeviation: 5,
        floodColor: '#000000',
        floodOpacity: 0.25
      })
  }

  // 使用新写法
  Rect()
    .width(120)
    .height(80)
    .x(90)
    .y(60)
    .fill('#3498db')
    .rx(12)
    .ry(12)
    .filter('url(#shadowNew)')
}

// HarmonyOS 6适配:使用CSS filter替代SVG滤镜
@Builder
SimpleFilterDemo() {
  Column({ space: 12 }) {
    // 6.0中可直接用CSS filter函数
    Image($r('app.media.sample'))
      .width(200)
      .height(150)
      .objectFit(ImageFit.Cover)
      .filter('hue-rotate(90deg)')  // 色相旋转

    Image($r('app.media.sample'))
      .width(200)
      .height(150)
      .objectFit(ImageFit.Cover)
      .filter('saturate(2) invert(0.8)')  // 饱和度+反色组合
  }
}

六、总结

维度 评价
学习难度 ⭐⭐⭐⭐⭐
使用频率 ⭐⭐⭐
重要程度 ⭐⭐⭐⭐

SVG滤镜就像是一个"图像处理瑞士军刀"——单个原语看起来功能有限,但组合起来就能产生无穷无尽的效果。本文我们系统学习了六大核心滤镜原语:

feGaussianBlur 是最基础也最常用的,模糊是很多高级效果的基石。feColorMatrix 是最强大的,4×5矩阵可以精确控制每个颜色通道的变换。feComposite 是最关键的,它决定了多个效果如何叠加合成。feTurbulence 是最神奇的,能从无到有生成各种噪声纹理。feConvolveMatrix 是最专业的,自定义卷积核可以实现锐化、浮雕、边缘检测等图像处理算法。feDisplacementMap 是最有趣的,用一张图的像素值来扭曲另一张图。

掌握了这些原语及其组合方式,你就拥有了在HarmonyOS中实现任意视觉效果的能力。从简单的投影模糊到复杂的毛玻璃霓虹灯,从静态的图像处理到动态的噪声动画,SVG滤镜都能胜任。唯一的限制,就是你的想象力了。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。