OpenGL中的色调滤镜实现

OpenGL 专栏收录该内容
¥59.90 ¥99.00
37篇文章

在计算机图形学中,色调滤镜是一种常用的图像处理技术,它可以改变图像的色调,从而产生不同的视觉效果。在本文中,我们将使用OpenGL编写代码来实现一个简单的色调滤镜效果。

首先,我们需要创建一个OpenGL上下文,并设置好视口、投影矩阵和模型视图矩阵。这些步骤不是本文的重点,因此我们将直接进入色调滤镜的实现。

在OpenGL中,我们可以使用片段着色器来对图像进行处理。片段着色器是一种在图形渲染管线的最后阶段对每个像素进行处理的程序。以下是一个简单的片段着色器代码示例,用于实现色调滤镜效果:

#version 330 core

in vec2 TexCoords;
out vec4 FragColor;

uniform sampler2D image;
uniform float hue;

void main()
{
    vec4 texColor = texture(image, TexCoords);
    
    // 转换RGB颜色到HSV颜色空间
    float r = texColor.r;
    float g = texColor.g;
    float b = texColor.b;
    
    float cmax = max(max(r, g), b);
    float cmin = min(min(r, g), b);
    float delta = cmax - cmin;
    
    float h = 0.0;
    if (delta == 0.0)
        h = 0.0;
    else if (cmax == r)
        h = 60.0 * mod((
SkiaSharp图像处理黑科技:用GPU加速实现PS级滤镜效果(MAUI/WPF通用) 本文深入解析SkiaSharp如何利用GPU加速技术实现媲美Photoshop的高级滤镜效果,适用于MAUI和WPF平台。通过详细代码示例和性能对比,展示GPU加速在图像处理中的显著优势,包括边缘检测、色调分离等高级滤镜的实现与优化策略。 阅读详情

相关推荐

openGL ES进阶教程(六)美颜滤镜之美白,磨皮,红润

网上搜罗了一堆的美颜滤镜效果,可惜尽不如人意。最后偶然看到ios上提供了一个用OC写的美颜滤镜,好吧,改写成Java的试试。好在大学时期搞过一段时间IOS开发,用自己的半吊子的水平,没想到还真改成功了。先上效果图:网上搜涨痘痘的图片,搜到刘涛了,罪过罪过~原图:美颜后:可见有四个可滑动的bar,从上到下分别是,磨皮度,磨皮值,美白,红润。美颜原理磨皮:本质就是让像素点模糊,可以使用高斯模糊,但是可能

WangShuo的专栏 1万+

Android OpenGLES2.0开发(九):图片滤镜

还记得我们在Android OpenGLES2.0开发(一):艰难的开始这一篇中说到,OpenGL ES能做什么吗?其中一项就是对图片做处理,色调转换美颜等。专业的说法叫做滤镜,主要是用来实现图像的各种特殊效果。

xiaozhiwz的专栏 1162

用CameraX实现抖音式特效相机:美颜+滤镜+实时分析的完整代码实现

本文详细介绍了如何使用CameraX构建具备商业化水准的特效相机,涵盖从基础架构到高级功能的完整技术方案。通过实时美颜引擎、动态滤镜系统和性能调优等实践,帮助开发者实现抖音式特效相机的完整代码实现,提升短视频应用的用户体验。

weixin_29281915的博客 203

利用OpenGL Shader实现CUBE/3DL LUT到PNG的高效转换

本文详细介绍了如何利用OpenGL Shader实现CUBE/3DL LUT到PNG的高效转换,提升游戏开发和视频处理中的颜色映射性能。通过解析LUT数据结构、优化纹理采样算法,并提供完整的OpenGL实现方案,帮助开发者快速掌握这一关键技术。文章还涵盖了性能优化技巧和常见问题解决方案,适用于需要高效颜色处理的各类应用场景。

weixin_29230773的博客 395

前端图像处理性能优化:基于WebAssembly与C++的高性能滤镜引擎实践

图像处理作为计算机视觉的基础技术,其核心在于对像素矩阵进行高效的数学运算与变换。传统前端使用JavaScript处理图像时,受限于解释型语言的性能瓶颈,在处理高分辨率图片或复杂卷积运算(如高斯模糊、边缘检测)时往往面临卡顿。WebAssembly(Wasm)技术通过将C++、Rust等高性能语言编译为可在浏览器安全运行的字节码,实现了接近原生的计算速度,从根本上解决了这一性能瓶颈。其技术价值在于将计算密集型任务从JavaScript主线程剥离,通过内存直接操作与SIMD指令集优化,大幅提升处理效率。这一架构

weixin_34015336的博客 1358

利用WGL_NV_DX_interop实现D3D与OpenGL的高效资源互通

本文详细介绍了如何利用WGL_NV_DX_interop扩展实现Direct3D与OpenGL之间的高效资源互通。通过建立GPU内部的直接数据通道,该技术能避免CPU参与的显存数据回拷,显著提升视频处理、混合渲染等场景的性能。文章提供了从环境准备、核心API使用到避坑指南的完整实战教程。

g2h3i4j5的博客 486

风格化渲染系统:可编程视觉语义翻译器

风格化渲染系统是一种将三维几何、光照与材质等底层数据,转化为特定艺术风格(如梵高笔触、宫崎骏光影、水墨晕染)的可编程图形学系统。其核心原理在于深度介入渲染管线——从几何分析、风格化着色到语义化后处理,而非简单叠加滤镜或LUT。技术价值体现在参数化控制、系统解耦与跨平台一致性,支撑实时性、可复用性与美术-程序协同效率。典型应用场景包括独立游戏画风构建、影视前期概念验证、工业设计可视化及教育科普可视化。本文聚焦‘风格化渲染系统’与‘几何法轮廓线’两大关键技术支点,解析如何通过Shader层语义重构与参数物理锚定

weixin_34293911的博客 404

GPUImage头文件功能定义

GPUImage是现在做滤镜最主流的开源框架,作者BradLarson基于openGL对图片处理单元进行封装,提供出GPUImageFilter基类,配合shader,常用滤镜都拿下不是问题。 下载GPUImage地址共125个滤镜, 分为四类 Color adjustments: 31 filters, 颜色处理相关 Image processing: 40 filters, 图像处理相关.

未名湖917号的博客 615

手机也能跑!详解AnimeGANv3的轻量级设计:如何用102万参数实现实时动漫滤镜

本文深入解析了AnimeGANv3的轻量级设计,这款仅102万参数的动画生成器能在智能手机上实现实时动漫滤镜效果。文章详细介绍了其双尾生成网络、LADE模块等创新技术,以及移动端部署的关键策略,为开发者提供了实用的集成建议和性能优化方案。

weixin_33693070的博客 344

Photoshop小白也能搞定!3分钟学会把CUBE/3DL LUT转成OpenGL可用的PNG纹理

本文详细介绍了如何通过Photoshop将CUBE/3DL LUT转换为OpenGL可用的PNG纹理,无需编程基础即可实现。从理解LUT的核心价值到具体操作步骤,包括载入基准模板、应用目标LUT和输出优化方案,帮助影视后期和游戏开发领域的创意工作者快速掌握这一技术。

weixin_30872499的博客 119

Qt OpenGL二次渲染实现滤镜效果

在进行OpenGL编程的时候,有时候需要对渲染出来的场景进行二次渲染。场景二次渲染类似于给照片加滤镜,添加不同的渲染着色程序便可以呈现不同的效果。场景二次渲染需要两套着色程序,渲染流程如下图: 输入的图形数据经过Shader1渲染之后会被保存到Framebuffer中,在需要显示的时候Framebuffer中的数据会经过Shader2渲染呈现到屏幕上。下面通过一个简单的例子来说明如何使用Framebuffer进行二次渲染。渲染程序会先将对应的纹理渲染到内存中,然后通过Framebuffer对纹理进行二

yang1fei2的博客 3043

OpenGL帧缓冲与后处理全链路实战|全网独家复现FBO构建、多通道渲染、滤镜优化,助力游戏特效、AR画面、图像美化高效落地

在OpenGL实时渲染开发中,基础的模型绘制、光照渲染仅能输出原始三维画面,画面质感单调、无视觉层次,无法满足现代游戏、AR交互、图像可视化、智能视觉设备的画质需求。而帧缓冲对象(FBO)与屏幕后处理技术,是突破默认屏幕渲染限制、实现画面美化、特效叠加、离屏渲染的核心核心技术,也是高端渲染管线的必备模块。区别于直接渲染至屏幕的基础模式,FBO离屏渲染允许开发者将3D场景预先绘制在GPU自定义缓冲区中,将整帧画面转化为可二次编辑的纹理资源。

getusushu的博客 31

在OpenGL中实现快速近似抗锯齿 (FXAA)

抗锯齿有一个令人生畏的名字,但它对我们的计算机显示器的作用却是相当基本的。可以这样想——一条线具有无限的分辨率,但我们的数字显示器却没有。因此,当我们将一条线“捕捉”到显示器上的像素网格时,我们可以通过想象沿线的部分像素来进行补偿,假装我们拥有比实际分辨率高得多的显示器。就像这样:正如您在我绘制的这些弯曲的黑色小线上所看到的,抗锯齿通过使用灰色像素来模拟线条边缘的部分像素来产生优质的图像。这是一个黑客,但就黑客而言,它非常有效。当然,解决这个问题的正确方法首先是拥有极高分辨率的显示器。

如果想成为中心,那么就到中心去吧。 562

RK3568平台开发系列讲解(视频篇)视频渲染OpenGL ES是什么

📢渲染并不单单是要把画面绘制到屏幕上,更多的是需要构建一个跨平台、可扩展、高性能的渲染引擎。这对于后续的一些处理是非常关键的,我们选择的技术是 OpenGL ES,虽然它上手难度会大一些,但是通过接下来的学习,我会带你彻底掌握这项技术,让我们一起来进入 OpenGL ES 的新世界吧!

内核笔记 3024

OpenGL 进阶系列12 - 图像处理技术

OpenGL 图像处理是利用 OpenGL 的图形渲染功能来进行图像的操作、编辑、转换和特效处理。通过 OpenGL 的管线和着色器,可以实现许多高效且复杂的图像处理任务,例如图像模糊、锐化、边缘检测、色彩调整等。

GPU全栈博主 643

ShaderJoy —— 10 个滤镜之 “Sephia、锐化、高斯滤波、均值滤波、膨胀、腐蚀效果” 等【GLSL】

参考自:http://www.open-open.com/lib/view/open1328487204203.html。

ShaderJoy 的兴趣技术杂货铺 5382

工业互联网工控安全与工业质检AI大模型建设方案.pptx

工业互联网工控安全与工业质检AI大模型建设方案.pptx

ATE测试基础——直流参数测试

芯片测试在发展过程中诞生了许多术语,初次接触的人大部分都会被绕晕。因此为方便广大读者理解,在开始介绍测试项之前,需要对测试领域的名词进行解释。还有部分较为抽象的内容,需要略作展开。DUT——Device Under Test,正在被测试的器件Pin——器件引脚,信号引脚分为输入,输出,三态和双向四类,负责与外界进行信息交互;电源引脚分为电源和地两类,结构与信号引脚不同,负责给器件内部运行和外部输出提供电平。输入:在外部信号和器件内部逻辑之间起缓冲作用的信号输入通道;

你骄傲地飞远的博客 1万+

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 101

山景BP10_128DBG开发板ADC_Key驱动

最近在学习山景BP10_128DBG开发板,想使用开发板上的按键。看了看原理图和之前用过的按键好像有点不一样。常见的按键都是判断IO口是否被拉低或拉高来判断按键是否被按下。山景BP10_128DBG开发板上的按键是ADC按键,每个按键按下之后ADC的采样值是不同的,通过ADC采样回来的值进而判断哪个按键按下。这种方式核心思想就是用一个ADC通道来节约IO口,对于IO紧张的芯片是一个不错的解决思路。

weixin_56646002的博客 1308

[SWPUCTF 2018]SimplePHP--一道简单的Phar反序列化题目

题目就不贴了,直接给出利用链①:echo会触发__toString魔术方法,所以这里的$this->test应该是Show类实例化的对象show②:这里应该使$this->str['str']为Test类实例化后的对象test,然后test->source会触发__get魔术方法(因为Test类没有名为source的成员变量,所以会触发get魔术方法,并且$key=source)③④:调用get方法,$...

Dream' 1258

2021-3-20组会 无监督训练下的音频分离 (音源分离) Unsupervised Audio Source Separation Using Generative Priors

0. 说明 一片具体论文的综述

ruclion的专栏 1349

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 282

OpenClaw小白使用全攻略

OpenClaw全能技能解锁指南:从基础到进阶 摘要: 本文提供OpenClaw AI智能体的完整使用教程,帮助用户从安装后"不知道如何用"到熟练掌握核心功能。教程包含:1)控制台5大区域详解和3个必做初始化设置;2)文件管理、浏览器自动化、文档生成等5大基础功能实操,每个功能配有详细操作步骤、指令模板和效果演示;3)10+高频场景解决方案,如整理文件、搜集资料、写总结等;4)进阶技巧和常见问题解答。通过清晰的图文指引,即使电脑小白也能快速上手,实现办公自动化、提升工作效率。

通俗易懂学IT 3057

RAG系统中Embedding模型选型实战

本文详细介绍了RAG系统中Embedding模型选型实战,希望能对学习RAG的同学们有所帮助。 文章目录 1. 前言 2. 思路解析 3. 测评数据集构建 3.1 步骤一 3.2 步骤二 3.3 数据示例 3.4 总结 4. 实战代码 4.1 本地模型 4.2 使用第三方的Embedding模型API

herosunly的博客 17万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 基于OpenGL的3D漫游游戏 - 古堡危机:丧尸围城
下一篇: OpenGL 第一课 - 绘制基本图形
普通网友
博客等级 码龄3年 17粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值