数据压缩实验报告2 TGA转YUV

ESP32-C61 eFuse控制器深度解析:寄存器架构与安全烧写实践 eFuse(电子熔丝)是嵌入式芯片实现硬件级不可逆配置与信任根构建的核心物理机制,其本质是通过电学编程固化关键安全参数。原理上依赖熔丝单元的单向导通/断开特性,结合Reed-Solomon纠错、多级写保护和时序可控编程,保障数据在宽温域与工艺偏差下的高可靠性。技术价值在于为Secure Boot、Flash加密、密钥隔离等安全功能提供可信锚点,支撑从启动到运行的全链路防护。典型应用场景涵盖物联网设备量产烧录、安全启动使能、MAC地址固化及抗DPA密码运算配置。本文聚焦ESP32-C61平台,深入解析其eFu 阅读详情

写在前面:
由于大二上学习C++时没有进行充分的练习,这次的实验先是自己想了很久但是无果,最后只能参考同学的代码。看不懂的地方和同学讨论并逐渐理解。感觉自己的情况就是知道大概的思路方法,但是不知道如何用代码实现。在没有参考的前提下没法自己写出完整的代码,还是需要多思考多练习。

代码:
pga_struct.h(用来创建pga文件的结构体)

#pragma once
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;

//TGA文件结构体
typedef struct TgaHeader 
{
    BYTE IDLength;        
    BYTE ColorMapType;    
    BYTE ImageTypeCode;     
} TGAHEAD;

typedef struct TgaHeader_Color 
{
    WORD ColorMapStart;      
    WORD ColorMapLength;     
    BYTE ColorMapDepth;      
}TGAHEAD_Color;

typedef struct TgaHeader_Info
{
    WORD XStart;        
    WORD YStart;        
    WORD w2;           
    WORD h2;         
    BYTE PixelDepth;      
    BYTE ImageDescriptor; 
}TgaHeader_Info;

void Read_rgb(ifstream& file, unsigned char* R_buffer, unsigned char* G_buffer, unsigned char* B_buffer, int h1, int w1);
void Read_rgb_ColorMap(ifstream& file, TGAHEAD_Color& color, unsigned char* R_buffer, unsigned char* G_buffer, unsigned char* B_buffer, int h1, int w1);

rgb2yuv.h(定义rgb2yuv.cpp中所需要的函数)

#pragma once
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <malloc.h>
using namespace std;

extern float RGB2YUV02990[256], RGB2YUV05870[256], RGB2YUV01140[256], RGB2YUV01684[256],
RGB2YUV03316[256], RGB2YUV05000[256], RGB2YUV04187[256], RGB2YUV00813[256];

void table();
void process(int h1, int w1, unsigned char* R, unsigned char* G, unsigned char* B, unsigned char* Y, unsigned char* U, unsigned char* V);
void subsample(int h2, int w2, unsigned char* U, unsigned char* V, unsigned char* U2, unsigned char* V2);
void write(int h2, int w2, unsigned char* Y, unsigned char* U, unsigned char* V);

tga.cpp(主要包含读取rgb数据和颜色表的函数)

#include "tga_struct.h"

void Read_rgb(ifstream& file, unsigned char* R_buffer, unsigned char* G_buffer, unsigned char* B_buffer, int h1, int w1) 
{
	for (int i = h1 - 1; i >= 0; i--)
	{
		for (int j = 0; j < w1; j++)
		{
			file.read((char*)(B_buffer + (i * w1 + j)), 1);
			file.read((char*)(G_buffer + (i * w1 + j)), 1);
			file.read((char*)(R_buffer + (i * w1 + j)), 1);
		}
	}
}

void Read_rgb_ColorMap(ifstream& file, TGAHEAD_Color& color, unsigned char* R_buffer, unsigned char* G_buffer, unsigned char* B_buffer, int h1, int w1)
{
	unsigned char* Table_R = new unsigned char[color.ColorMapLength];
	unsigned char* Table_G = new unsigned char[color.ColorMapLength];
	unsigned char* Table_B = new unsigned char[color.ColorMapLength];
	unsigned char* k = new unsigned char[h1 * w1];

	// 读入颜色表
	for (int i = 0; i < color.ColorMapLength; i++)
	{
		file.read((char*)(Table_B + i), 1);
		file.read((char*)(Table_G + i), 1);
		file.read((char*)(Table_R + i), 1);
	}
	for (int i = h1 - 1; i >= 0; i--) 
	{
		for (int j = 0; j < w1; j++) {
			file.read((char*)(k + (i * w1 + j)), 1);
			*(B_buffer + (i * w1 + j)) = *(Table_B + (*(k + (i * w1 + j))));
			*(G_buffer + (i * w1 + j)) = *(Table_G + (*(k + (i * w1 + j))));
			*(R_buffer + (i * w1 + j)) = *(Table_R + (*(k + (i * w1 + j))));
		}
	}
	if (Table_R != NULL)
		delete Table_R; 
	if (Table_G != NULL) 
		delete Table_G; 
	if (Table_B != NULL) 
		delete Table_B; 
	if (k != NULL)
		delete k;
}

rgb2yuv.cpp(将rgb分量转换为yuv分量、下采样、写文件的函数)

#include "rgb2yuv.h"

void table() 
{
	for (int i = 0; i < 256; i++) {
		RGB2YUV02990[i] = (float)0.2990 * i;
		RGB2YUV05870[i] = (float)0.5870 * i;
		RGB2YUV01140[i] = (float)0.1140 * i;
		RGB2YUV01684[i] = (float)0.1684 * i;
		RGB2YUV03316[i] = (float)0.3316 * i;
		RGB2YUV05000[i] = (float)0.5000 * i;
		RGB2YUV04187[i] = (float)0.4187 * i;
		RGB2YUV00813[i] = (float)0.0813 * i;
	}
}
// 计算yuv分量的值
void process(int h1, int w1, unsigned char* R, unsigned char* G, unsigned char* B, unsigned char* Y, unsigned char* U, unsigned char* V) 
{
	float k;
	for (int i = 0; i < h1 * w1; i++) 
	{
		// 计算y分量
		k = RGB2YUV02990[*(R + i)] + RGB2YUV05870[*(G + i)] + RGB2YUV01140[*(B + i)];
		if (k > 236)
			k = 236;
		else if (k < 16)
			k = 16;
		*(Y + i) = (unsigned char)k;
		// 计算u分量
		k = -RGB2YUV01684[*(R + i)] - RGB2YUV03316[*(G + i)] + RGB2YUV05000[*(B + i)] + 128;
		if (k > 236)
			k = 236;
		else if (k < 16)
			k = 16;
		*(U + i) = (unsigned char)k;
		// 计算v分量
		k = RGB2YUV05000[*(R + i)] - RGB2YUV04187[*(G + i)] - RGB2YUV00813[*(B + i)] + 128;
		if (k > 236)
			k = 236;
		else if (k < 16)
			k = 16;
		*(V + i) = (unsigned char)k;
	}
}

//写yuv文件
void write(int h2, int w2, unsigned char* Y, unsigned char* U, unsigned char* V)
{
	ofstream Output_file;
	Output_file.open("new.yuv", ios::binary, ios::trunc);
	if (!Output_file) 
		cout << "Failed to open file" << endl;
	else {
		Output_file.write((char*)Y, h2 * w2);
		Output_file.write((char*)U, h2 * w2 / 4);
		Output_file.write((char*)V, h2 * w2 / 4);
		Output_file.close();
	}
}

// uv分量下采样
void subsample(int h2, int w2, unsigned char* U, unsigned char* V, unsigned char* U2, unsigned char* V2) 
{
	int k = 0;
	float uuu, vvv;
	for (int i = 0; i < h2 * w2 / 4; i++) {
		uuu = (float)(*(U + k) + *(U + k + 1) + *(U + k + w2) + *(U + k + 1 + w2)) / 4;
		vvv = (float)(*(V + k) + *(V + k + 1) + *(V + k + w2) + *(V + k + 1 + w2)) / 4;
		*(U2 + i) = (unsigned char)uuu;
		*(V2 + i) = (unsigned char)vvv;

		if ((i + 1) % (w2 / 2) == 0) 
			k = k + 2 + w2;
		else 
			k = k + 2;
	}
}

task2.cpp(主函数)

#include "rgb2yuv.h"
#include "tga_struct.h"

float RGB2YUV02990[256], RGB2YUV05870[256], RGB2YUV01140[256], RGB2YUV01684[256],RGB2YUV03316[256], RGB2YUV05000[256], RGB2YUV04187[256], RGB2YUV00813[256];

int main(int argc, char* argv[])
{
    unsigned char* buffer_Y = NULL, * buffer_U = NULL, * buffer_V = NULL;
    unsigned char* buffer_R = NULL, * buffer_G = NULL, * buffer_B = NULL;
    unsigned char* U2 = NULL, * V2 = NULL;

    table();
    //判断是否打开文件
    ifstream input_file;
    input_file.open(argv[1], ios::in | ios::binary);
    if (!input_file.is_open()) 
        cout << "input file not opened." << endl;

    // 定义文件头
    TGAHEAD FILE_header;
    TGAHEAD_Color FILE_header_CMap;
    TgaHeader_Info FILE_header_Info;
    // 读文件头
    input_file.read((char*)(&FILE_header), 3);
    input_file.read((char*)(&FILE_header_CMap), 5);
    input_file.read((char*)(&FILE_header_Info), 10);

    int w1 = FILE_header_Info.w2;
    int h1 = FILE_header_Info.h2;

    //建立缓冲区
    buffer_R = new unsigned char[w1 * h1];
    buffer_G = new unsigned char[w1 * h1];
    buffer_B = new unsigned char[w1 * h1];
    buffer_Y = new unsigned char[w1 * h1];
    buffer_U = new unsigned char[w1 * h1];
    buffer_V = new unsigned char[w1 * h1];
    //读rgb文件的内容
    Read_rgb(input_file, buffer_R, buffer_G, buffer_B, h1, w1);
    //计算yuv分量的值
    process(h1, w1, buffer_R, buffer_G, buffer_B, buffer_Y, buffer_U, buffer_V);
    U2 = new unsigned char[int(w1 * h1 / 4)];
    V2 = new unsigned char[int(w1 * h1 / 4)];
    //下采样
    subsample(h1, w1, buffer_U, buffer_V, U2, V2);
    write(h1, w1, buffer_Y, U2, V2);
    //关闭文件,释放缓冲区
    input_file.close();
    if (buffer_Y != NULL) 
        delete buffer_Y; 
    if (buffer_U != NULL) 
        delete buffer_U; 
    if (buffer_V != NULL)
        delete buffer_V; 
    if (U2 != NULL)
        delete U2; 
    if (V2 != NULL) 
        delete V2; 
    if (buffer_R != NULL) 
        delete buffer_R; 
    if (buffer_G != NULL) 
        delete buffer_G; 
    if (buffer_B != NULL)  
        delete buffer_B; 
}

运行结果:在这里插入图片描述原本的TGA图像文件

在这里插入图片描述左上角的墙与原图有色差,眼睛部分明显有被锐化的感觉

嵌套学习 (Nested Learning, NL):赋予AI持续学习能力的革命性范式 嵌套学习(Nested Learning, NL)的核心哲学在于彻底颠覆传统深度学习中将模型架构(Architecture)与优化算法(Optimization)视为两个独立组件的“扁平化”视角 。传统方法通常将神经网络的结构设计和其训练过程分离开来,模型架构是预先定义好的静态蓝图,而优化算法(如SGD、Adam)则是一个外部的、统一的规则引擎,负责在训练期间调整模型参数 。这种分离的视角隐藏了模型内部不同组件之间复杂的梯度流和动态更新过程,将整个学习系统视为一个单一层次的优化问题。然而,嵌套学习范式提出, 阅读详情

相关推荐

cvtColor +内存泄漏

题目不知道怎么取,因为cvtColor并没有产生内存泄漏,但是我由于没有正确使用cvtColor而出现了内存泄漏的问题,所以暂且以cvtColor+内存泄漏为题 1.应用背景 项目中用到cvtColor的地方是需要将灰度图转为3通道的彩色图(实际上转换后仍然为灰色的,但是电脑认为的是3通道的彩色图了) 因此需要用到以下语句 cvtColor(src_img, cvMtxRGB, C

smilebluesky的专栏 6058

C++实现TGA到YUV文件转换

本次试验通过C++,实现将TGA文件转换为YUV文件。目前只支持非压缩无颜色表24、32位格式以及非压缩有颜色表RGB格式的转换。 一、基本原理 1. TGA文件结构 具体参见: 2. RGB2YUV彩色空间转换基本原理 具体参见: 二、试验流程 三、代码实现 //main.cpp #include <stdio.h> #include <windows.h> #incl...

m0_46293129的博客 302

手把手教你用Matlab为PMSM电流环设计2P2Z补偿器(附与PI对比)

本文详细介绍了如何使用Matlab的controlSystemDesigner工具为永磁同步电机(PMSM)电流环设计2P2Z补偿器,并与传统PI控制器进行性能对比。通过频域分析和时域仿真,展示了2P2Z补偿器在提升带宽、减少超调等方面的优势,为高性能伺服驱动和精密运动控制提供了实用解决方案。

weixin_42551227的博客 378

彩色空间转换(修订之后)

文件头 #include "pch.h" #include <iostream> #include <cstdio> #include <fstream> #include <windows.h> #include <malloc.h> #include <stdlib.h> using namespace std; TGA...

zhaly615的博客 231

项目管理——14规划绩效域论文套路

规划绩效域论文套路

Flee Elf 1153

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

数据压缩(七)——TGA2YUV文件转换

任务:将tga文件转换为yuv文件 文章目录(一)TGA文件解析1.1 TGA文件结构TGA文件原始文件结构(v1.0)TGA文件扩展文件结构(v2.0) (一)TGA文件解析 1.1 TGA文件结构 TGA文件原始文件结构(v1.0)  &emsp;由两个部分组成:文件头、图像/颜色表数据。 TGA文件扩展文件结构(v2.0)   由5个部分组成:文件头、图像/颜色表数据、开发者自定...

CRR的博客 664

嵌入式软考必备知识点:嵌入式系统开发中的重要概念和示例代码

在嵌入式软考中,有一些重要的知识点需要掌握,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口等。实时操作系统是一种专门设计用于嵌入式系统的操作系统,可以提供对任务调度、中断处理和资源管理等方面的支持。GPIO(通用输入输出):GPIO是嵌入式系统中常用的硬件接口,用于连接外部设备和嵌入式系统。以上是嵌入式软考中的一些必备知识点,包括嵌入式系统的基本概念、编程语言、实时操作系统和硬件接口。通过配置串口的波特率、数据位数和校验位等参数,可以实现与其他设备的可靠通信。一、嵌入式系统的基本概念。

PixeGO的博客 313

TGA(MOV)格式转YUV422

一:tga图像格式 https://blog.youkuaiyun.com/blues1021/article/details/45438673 tga存储格式:移小端模式存储,包括格式规定以及RGB数据,也就是BGR形式存放(直接读入即可),图片左上角的一行像素可能放在文件内存中的最后一行,或者文件内存中的一行就是左上角一行数据,tga头文件记录了调色板偏移大小和规格,图像像素的偏移大小和规格,常见格式...

zuodenghuakai的博客 994

基于STM32设计的环境监测系统(华为云IOT)_300

随着空气污染问题日益严峻,环境空气质量的监测变得愈加重要。为了解决这一问题,本项目设计并实现了一款基于STM32的空气质量监测设备,能够实时监测空气中的温湿度、二氧化碳浓度和甲醛浓度,并通过OLED显示屏展示数据。此外,设备支持通过WIFI模块将数据上传至云端,用户可以通过手机APP或Windows上位机查看实时数据。设备采用MQTT协议与华为云IOT物联网服务器进行数据通信,确保数据的实时性和可靠性。本项目还结合了低功耗设计和高灵敏度传感器,使得设备能够高效稳定地运行,并实现远程监控功能。

696

PyCharm 接入 OpenAI Codex CLI 的 4 步配置与调试实录

揭示 Codex CLI 在 PyCharm 中上下文失稳的四大根源:CLI 启动模式与 IDE 进程模型冲突、stdin/stdout 流式处理不兼容、环境变量污染、AST 注释缺失,并给出基于 Shell 脚本桥接与结构化上下文注入的稳定接入方案。

weixin_42627902的博客 374

数据压缩(六)——TGA转YUV

感觉编程上还是有些困难,可能理解的还不够,这个TGA转YUV文件的代码拖了比较久。 先来分析一下TGA的文件格式 TGA文件头 TGA FILE HEADER 图像/颜色表数据 IMAGE/COLOR MAP DATA 开发者区域 DEVELOPER AREA 拓展区域 EXTENSION AREA TGA文件注脚 TGA FLIE FOOTER 代码主要关注于1和2两部分数据 文件头可以...

weixin_45430791的博客 247

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1005

数据压缩·作业六(tga文件转yuv文件)

tga转yuv,C语言实现一、实验内容二、实验原理1、关于tga文件格式的分析2、关于rgb转yuv三、实验步骤1、读取tga文件并得到rgb数据2、获得的图像数据转置3、将得到rgb数据转换成yuv数据并写入yuv文件中四、完整代码五、结果六、遇到的错误及分析 一、实验内容 将一个tga格式的文件转换成yuv格式的文件(选择了类型2、TGA24的TGA文件进行转换) 二、实验原理 1、关于tga...

qq_42949426的博客 616

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据压缩TGA2YUV

一、实验目标 1.读取TGA图像数据 2.将TGA格式转为YUV格式 二、实验原理 1.TGA的结构 名称 偏移 长度 解释 图像信息字段 0 1 指出图像信息字段长度:0~255 颜色表类型 1 1 0:无颜色表;1:有颜色表 图像类型码 2 1 图像格式 颜色表首址 3 2 颜色表首的入口索引,整型 颜色表长度 5 2 整型 颜色表项位数 7 1 16:16...

weixin_45443751的博客 367

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据压缩实验 | TGA文件转YUV文件

TGA文件头有5个字段,共18个字节 建立TGA文件头的结构体: typedef struct { unsigned char IDLength; unsigned char ColorMapType; unsigned char ImageType; unsigned short FirstEntryIndex;//颜色首地址 unsigned short ColorMapLength;//颜色...

layata的博客 228

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据压缩_实验二_TGA2YUV

文章目录文件格式转换实验一、实验目标二、实验原理1、TGA文件格式2、TGA颜色显示方式三、实验步骤1、基本流程图2、关键步骤- 创建与读入文件头结构体- 判断是否存在图像信息字段- 读入颜色表数据- 读入图像信息数据四、实验结果1、真彩色图像2、伪彩色图像五、错误总结-结构体未考虑字节对齐- 图像信息数据读取顺序出错六、完整代码 文件格式转换实验 一、实验目标 读入TGA文件 将TGA文...

weixin_41821317的博客 764

TGA文件转YUV文件

首先开辟一个缓存区。 int w=256; int h=256;//程序初始化(打开两个文件、定义变量和缓冲区等) FILE* rgbFile=NULL; FILE* yuvFile = NULL; unsigned char*R,*G,*B,*pf,*Y,*U,*V,*u,*v; //打开rgb文件 rgbFile = fopen(“D:\dsx\sjys\down.rgb”, “rb”); /...

zhaly615的博客 267

TGA转换成YUV420

目录TGA文件分析TGA简介文件格式分析代码实现main.cpprgb2yuv实验结果及分析 TGA文件分析 TGA简介 TGA是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga,该格式支持压缩,使用不失真的压缩算法,可以带通道图,另外还支持行程编码压...

qq_43310997的博客 780

数据压缩试验二:TGA 文件转 YUV 文件的 C++ 实现方法

基础知识 - TGA 文件格式 TGA 文件 Truevision TGA,一般被称作TARGA,是一种由Truevision科技(现在已经被Avid科技收购)公司开发的光栅图像格式。这是一种TARGA和VISTA图形卡的原生数据格式,这两种芯片是IBM第一种支持真彩显示的图形卡。这种系列的图像卡是为了用PC进行专业的图像处理和视频编辑而开发的;因为这个原因,正常TGA格式的图像和NTSC和PAL...

Zachary_Chia的博客 311

数据压缩第六次作业:TGA文件转换为YUV文件

一、TGA文件格式基本介绍 TGA(Targa)格式是计算机上应用最广泛的图象格式。在兼顾了BMP的图象质量的同时又兼顾了JPEG的体积优势。并且还有自身的特点:通道效果、方向性。在CG领域常作为影视动画的序列输出格式,因为兼具体积小和效果清晰的特点。 TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有很大影响,是计算机生成图像向电视转换的一种首选格式。TGA图像格式最大的特点...

NTY518的博客 582

数据压缩(6):将TGA图像转为YUV文件

1.了解TGA文件里数据的储存方式 2.代码实现 #include "stdafx.h" using namespace std; #include <iostream> #include <cstdio> #include <fstream> #include <windows.h> #include <malloc.h> #incl...

weixin_46338503的博客 254

数据压缩第六次作业':还存在未知bug的PNG转YUV程序(上一篇文章TGA已完成)

数据压缩第六次作业’:还存在未知bug的PNG转YUV程序(上一篇文章TGA已完成) 一、前言: 在进行PNG和YUV的转化过程中,其实这些所有的文件之间的转化的思路都大同小异,都是先去查一下这个文件的存储格式是什么样子的,根据存储格式设计结构体来读取文件头,如果有调色板就设计调色板相关的读取方法,如果没有调色板,就按照真彩色来进行读取。但是,PNG的存储过程是一种利用了LZ77压缩算法的过程,P...

NTY518的博客 289

多媒体技术复习汇总

 1.         什么是媒体:媒体是信息表示和传输的载体。2.         媒体分类:感觉媒体,表示媒体,表现媒体,存储媒体,传输媒体3.         多媒体技术的定义和特点:多媒体技术就是计算机交互式综合处理声、文、图信息的技术,具有集成性、实时性和交互性。4.         多媒体标准:微软提出MPC5.         ISO和ITU联合制定的数字化图像压

zymaxs的专栏 4334

多媒体技术复习汇总 收藏

<br />多媒体技术复习汇总 收藏 <br /><br />1.         什么是媒体:媒体是信息表示和传输的载体。<br />2.         媒体分类:感觉媒体,表示媒体,表现媒体,存储媒体,传输媒体<br />3.         多媒体技术的定义和特点:多媒体技术就是计算机交互式综合处理声、文、图信息的技术,具有集成性、实时性和交互性。<br />4.         多媒体标准:微软提出MPC<br />5.         ISO和ITU联合制定的数字化图像压缩国际标准:JPEG标准

szu030606的专栏 1687
上一篇: 数据压缩作业 图像文件分析
下一篇: 数据压缩实验报告3 LZW编解码
タン
博客等级 码龄8年 15粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值