佳能相机开发包Canon EDSDK 3.6.1-Windows:开发者指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:佳能相机开发包Canon EDSDK 3.6.1-Windows为开发者提供了与佳能相机交互的强大工具。通过EDSDK API,开发者可以控制相机的设置、实时预览、远程拍摄并处理图像。本指南涵盖了EDSDK的关键知识点,包括:EDSDK简介、操作系统支持、示例代码、类图和时序图、相机控制、实时预览、图像下载和处理、事件通知、多相机支持和编程语言兼容性。

1. EDSDK简介

EDSDK(EOS Digital Software Development Kit)是佳能公司提供的软件开发工具包,用于控制和访问佳能数码单反相机(EOS)。它提供了一组全面的API,允许开发者使用各种编程语言与相机进行交互,从而实现各种摄影和图像处理功能。EDSDK支持多种操作系统,包括Windows、Linux和macOS,并提供了丰富的示例代码和文档,方便开发者快速上手。

2. 操作系统的支持

2.1 Windows

EDSDK在Windows操作系统上提供了全面的支持。它提供了用于与相机进行通信的本机API,并支持广泛的相机型号。

安装和配置

在Windows上安装EDSDK非常简单。只需下载并运行EDSDK安装程序,它将自动安装必要的组件和库。安装完成后,您需要将EDSDK库添加到您的项目中。

代码示例

以下代码示例演示了如何在Windows上使用EDSDK:

#include <EDSDK.h>

int main() {
  // 初始化EDSDK库
  EdsInitializeSDK();

  // 获取相机列表
  EdsCameraListRef cameraList;
  EdsGetCameraList(&cameraList);

  // 选择第一个相机
  EdsCameraRef camera;
  EdsOpenCamera(&cameraList, 0, &camera);

  // 拍摄图像
  EdsTakePicture(camera);

  // 下载图像
  EdsImageRef image;
  EdsDownloadImage(camera, &image);

  // 保存图像
  EdsSaveImage(image, "image.jpg");

  // 释放资源
  EdsReleaseImage(image);
  EdsCloseCamera(camera);
  EdsTerminateSDK();

  return 0;
}

逻辑分析

此代码示例执行以下操作:

  1. 初始化EDSDK库。
  2. 获取可用相机的列表。
  3. 打开第一个相机。
  4. 拍摄图像。
  5. 下载图像。
  6. 保存图像。
  7. 释放资源。

2.2 Linux

EDSDK在Linux操作系统上也提供了支持,但不如Windows全面。它依赖于libusb库与相机进行通信,并且支持的相机型号较少。

安装和配置

在Linux上安装EDSDK需要以下步骤:

  1. 安装libusb库。
  2. 下载EDSDK Linux SDK。
  3. 解压SDK并编译库。
  4. 将EDSDK库添加到您的项目中。

代码示例

以下代码示例演示了如何在Linux上使用EDSDK:

#include <EDSDK/EDSDK.h>

int main() {
  // 初始化EDSDK库
  EdsInitializeSDK();

  // 获取相机列表
  EdsCameraListRef cameraList;
  EdsGetCameraList(&cameraList);

  // 选择第一个相机
  EdsCameraRef camera;
  EdsOpenCamera(&cameraList, 0, &camera);

  // 拍摄图像
  EdsTakePicture(camera);

  // 下载图像
  EdsImageRef image;
  EdsDownloadImage(camera, &image);

  // 保存图像
  EdsSaveImage(image, "image.jpg");

  // 释放资源
  EdsReleaseImage(image);
  EdsCloseCamera(camera);
  EdsTerminateSDK();

  return 0;
}

逻辑分析

此代码示例与Windows示例类似,但使用了libusb库与相机进行通信。

2.3 macOS

EDSDK不支持macOS操作系统。如果您需要在macOS上控制相机,可以使用第三方库,例如libgphoto2。

3. 示例代码

3.1 相机控制示例

相机连接和断开
EdsError err = EdsInitializeSDK();
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsCameraRef cameraRef;
err = EdsGetCameraList(&cameraRef, 1);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsOpenSession(cameraRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

// ... 相机控制操作 ...

err = EdsCloseSession(cameraRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsTerminateSDK();
if (err != EDS_ERR_OK) {
    // 处理错误
}
相机属性获取和设置
EdsPropertyID propertyId = kEdsPropID_ISOSpeed;
EdsUInt32 propertyValue;
EdsError err = EdsGetPropertyData(cameraRef, propertyId, 0, &propertyValue);
if (err != EDS_ERR_OK) {
    // 处理错误
}

// ... 相机属性设置 ...

err = EdsSetPropertyData(cameraRef, propertyId, 0, propertyValue);
if (err != EDS_ERR_OK) {
    // 处理错误
}

3.2 实时预览示例

实时预览的启动和停止
EdsError err = EdsSetPropertyData(cameraRef, kEdsPropID_Evf_OutputDevice, 0, kEdsEvfOutputDevice_PC);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsSendCommand(cameraRef, kEdsCameraCommand_Evf_Mode, 0);
if (err != EDS_ERR_OK) {
    // 处理错误
}

// ... 实时预览操作 ...

err = EdsSendCommand(cameraRef, kEdsCameraCommand_Evf_Mode, 1);
if (err != EDS_ERR_OK) {
    // 处理错误
}
实时预览图像的获取和显示
EdsStreamRef streamRef;
err = EdsCreateMemoryStream(0, &streamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsSetPropertyData(cameraRef, kEdsPropID_Evf_OutputDevice, 0, kEdsEvfOutputDevice_PC);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsSendCommand(cameraRef, kEdsCameraCommand_Evf_Mode, 0);
if (err != EDS_ERR_OK) {
    // 处理错误
}

// ... 实时预览图像获取 ...

err = EdsSendCommand(cameraRef, kEdsCameraCommand_Evf_Mode, 1);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsReleaseStream(streamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

3.3 图像下载和处理示例

图像下载
EdsStreamRef streamRef;
err = EdsCreateMemoryStream(0, &streamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsSetPropertyData(cameraRef, kEdsPropID_SaveTo, 0, kEdsSaveTo_Host);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsSendCommand(cameraRef, kEdsCameraCommand_TakePicture, 0);
if (err != EDS_ERR_OK) {
    // 处理错误
}

// ... 图像下载操作 ...

err = EdsReleaseStream(streamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}
图像格式转换
EdsImageRef imageRef;
err = EdsCreateImageRef(streamRef, &imageRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsImageInfo imageInfo;
err = EdsGetImageInfo(imageRef, &imageInfo);
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsStreamRef newStreamRef;
err = EdsCreateMemoryStream(0, &newStreamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsSaveImageRef(imageRef, newStreamRef, kEdsImageFormat_Jpeg, &imageInfo);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsReleaseStream(newStreamRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}
图像处理(裁剪、旋转、调整大小)
EdsImageRef imageRef;
err = EdsCreateImageRef(streamRef, &imageRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsImageInfo imageInfo;
err = EdsGetImageInfo(imageRef, &imageInfo);
if (err != EDS_ERR_OK) {
    // 处理错误
}

EdsRect cropRect;
cropRect.x = 100;
cropRect.y = 100;
cropRect.width = 200;
cropRect.height = 200;

EdsImageRef croppedImageRef;
err = EdsCreateImageRef(streamRef, &croppedImageRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsCropImageRef(imageRef, croppedImageRef, &cropRect);
if (err != EDS_ERR_OK) {
    // 处理错误
}

err = EdsReleaseImageRef(croppedImageRef);
if (err != EDS_ERR_OK) {
    // 处理错误
}

4. 类图和时序图

4.1 EDSDK类图

EDSDK类图展示了EDSDK库中主要类的层次结构和关系。它有助于理解EDSDK库的整体架构和不同类之间的交互。

graph LR
subgraph EDSDK
    EdsCamera >> EdsCameraList
    EdsCamera >> EdsProperty
    EdsCamera >> EdsEvent
    EdsProperty >> EdsPropertyDesc
    EdsEvent >> EdsObjectEvent
    EdsEvent >> EdsStateEvent
end

4.2 EDSDK时序图

EDSDK时序图描述了使用EDSDK库进行相机操作的典型流程。它展示了不同函数和事件之间的交互,以及相机操作的顺序。

sequenceDiagram
participant Camera
participant Application
Application->Camera: OpenSession
Camera->Application: SessionOpened
Application->Camera: GetCameraList
Camera->Application: CameraListObtained
Application->Camera: GetCamera
Camera->Application: CameraObtained
Application->Camera: SetProperty
Camera->Application: PropertySet
Application->Camera: TakePicture
Camera->Application: PictureTaken
Application->Camera: CloseSession
Camera->Application: SessionClosed
时序图说明
  1. OpenSession(): 应用程序调用OpenSession()函数打开与相机的会话。
  2. SessionOpened: 相机发送SessionOpened事件,表示会话已打开。
  3. GetCameraList(): 应用程序调用GetCameraList()函数获取可用相机的列表。
  4. CameraListObtained: 相机发送CameraListObtained事件,其中包含可用相机的列表。
  5. GetCamera(): 应用程序调用GetCamera()函数获取特定相机的句柄。
  6. CameraObtained: 相机发送CameraObtained事件,其中包含相机的句柄。
  7. SetProperty(): 应用程序调用SetProperty()函数设置相机的属性。
  8. PropertySet: 相机发送PropertySet事件,表示属性已设置。
  9. TakePicture(): 应用程序调用TakePicture()函数拍摄图像。
  10. PictureTaken: 相机发送PictureTaken事件,表示图像已拍摄。
  11. CloseSession(): 应用程序调用CloseSession()函数关闭与相机的会话。
  12. SessionClosed: 相机发送SessionClosed事件,表示会话已关闭。

5. 相机控制

5.1 相机连接和断开

连接相机

  1. 使用 EdsInitializeSDK() 函数初始化EDSDK库。
  2. 使用 EdsGetCameraList() 函数获取相机列表。
  3. 选择要连接的相机并使用 EdsOpenSession() 函数打开会话。

代码块:

EdsError EdsInitializeSDK(EdsUInt32 *outRef);
EdsError EdsGetCameraList(EdsCameraRef **outCameraList, EdsUInt32 *outCount);
EdsError EdsOpenSession(EdsCameraRef camera, EdsSessionRef *outSession);

逻辑分析:

  • EdsInitializeSDK() 函数初始化EDSDK库并返回库的引用。
  • EdsGetCameraList() 函数获取连接到计算机的相机的列表并返回相机引用数组和相机的数量。
  • EdsOpenSession() 函数打开与指定相机的会话并返回会话引用。

断开相机

  1. 使用 EdsCloseSession() 函数关闭会话。
  2. 使用 EdsTerminateSDK() 函数终止EDSDK库。

代码块:

EdsError EdsCloseSession(EdsSessionRef session);
EdsError EdsTerminateSDK();

逻辑分析:

  • EdsCloseSession() 函数关闭与相机的会话。
  • EdsTerminateSDK() 函数终止EDSDK库并释放所有资源。

5.2 相机属性获取和设置

获取相机属性

  1. 使用 EdsGetPropertyData() 函数获取相机的指定属性值。

代码块:

EdsError EdsGetPropertyData(EdsSessionRef session, EdsPropertyID propertyID, EdsUInt32 propertySize, EdsChar *outPropertyData);

逻辑分析:

  • EdsGetPropertyData() 函数获取指定属性ID的相机属性值。
  • propertyID 参数指定要获取的属性ID。
  • propertySize 参数指定属性值的大小(以字节为单位)。
  • outPropertyData 参数接收属性值。

设置相机属性

  1. 使用 EdsSetPropertyData() 函数设置相机的指定属性值。

代码块:

EdsError EdsSetPropertyData(EdsSessionRef session, EdsPropertyID propertyID, EdsUInt32 propertySize, EdsChar *inPropertyData);

逻辑分析:

  • EdsSetPropertyData() 函数设置指定属性ID的相机属性值。
  • propertyID 参数指定要设置的属性ID。
  • propertySize 参数指定属性值的大小(以字节为单位)。
  • inPropertyData 参数指定要设置的属性值。

5.3 拍摄图像和视频

拍摄图像

  1. 使用 EdsSendCommand() 函数向相机发送拍摄图像的命令。

代码块:

EdsError EdsSendCommand(EdsSessionRef session, EdsCameraCommand command, EdsUInt32 param);

逻辑分析:

  • EdsSendCommand() 函数向相机发送指定命令。
  • command 参数指定要发送的命令。
  • param 参数指定命令的参数(如果需要)。

拍摄视频

  1. 使用 EdsSetPropertyData() 函数设置视频拍摄属性。
  2. 使用 EdsSendCommand() 函数向相机发送开始视频拍摄的命令。
  3. 使用 EdsSendCommand() 函数向相机发送停止视频拍摄的命令。

代码块:

EdsError EdsSetPropertyData(EdsSessionRef session, EdsPropertyID propertyID, EdsUInt32 propertySize, EdsChar *inPropertyData);
EdsError EdsSendCommand(EdsSessionRef session, EdsCameraCommand command, EdsUInt32 param);

逻辑分析:

  • EdsSetPropertyData() 函数设置视频拍摄属性,例如视频格式、分辨率和帧速率。
  • EdsSendCommand() 函数向相机发送开始视频拍摄的命令。
  • EdsSendCommand() 函数向相机发送停止视频拍摄的命令。

5.4 设置曝光和对焦参数

设置曝光参数

  1. 使用 EdsSetPropertyData() 函数设置曝光模式、快门速度、光圈和ISO。

代码块:

EdsError EdsSetPropertyData(EdsSessionRef session, EdsPropertyID propertyID, EdsUInt32 propertySize, EdsChar *inPropertyData);

逻辑分析:

  • EdsSetPropertyData() 函数设置曝光参数,例如曝光模式、快门速度、光圈和ISO。
  • propertyID 参数指定要设置的曝光参数ID。
  • propertySize 参数指定曝光参数值的大小(以字节为单位)。
  • inPropertyData 参数指定要设置的曝光参数值。

设置对焦参数

  1. 使用 EdsSetPropertyData() 函数设置对焦模式、对焦点和对焦区域。

代码块:

EdsError EdsSetPropertyData(EdsSessionRef session, EdsPropertyID propertyID, EdsUInt32 propertySize, EdsChar *inPropertyData);

逻辑分析:

  • EdsSetPropertyData() 函数设置对焦参数,例如对焦模式、对焦点和对焦区域。
  • propertyID 参数指定要设置的对焦参数ID。
  • propertySize 参数指定对焦参数值的大小(以字节为单位)。
  • inPropertyData 参数指定要设置的对焦参数值。

6. 实时预览

6.1 实时预览的启动和停止

启动实时预览
EdsError EdsStartCapture(EdsCameraRef cameraRef, EdsUInt32 evfOutputDevice);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | evfOutputDevice | EVF 输出设备 |

停止实时预览
EdsError EdsStopCapture(EdsCameraRef cameraRef);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 |

6.2 实时预览图像的获取和显示

获取实时预览图像
EdsError EdsGetLiveViewImage(EdsCameraRef cameraRef, EdsUInt32 evfOutputDevice, EdsUInt32 bufferSize, EdsUInt8 *buffer);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | evfOutputDevice | EVF 输出设备 | | bufferSize | 缓冲区大小 | | buffer | 缓冲区 |

显示实时预览图像

实时预览图像的显示方式取决于应用程序的实现。可以使用 Qt、OpenGL 或其他图形库来显示图像。

6.3 实时预览设置

设置实时预览质量
EdsError EdsSetLiveViewImageQuality(EdsCameraRef cameraRef, EdsUInt32 quality);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | quality | 实时预览质量 |

设置实时预览帧速率
EdsError EdsSetLiveViewFrameRate(EdsCameraRef cameraRef, EdsUInt32 frameRate);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | frameRate | 实时预览帧速率 |

设置实时预览白平衡
EdsError EdsSetLiveViewWhiteBalance(EdsCameraRef cameraRef, EdsUInt32 whiteBalance);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | whiteBalance | 实时预览白平衡 |

设置实时预览曝光补偿
EdsError EdsSetLiveViewExposureCompensation(EdsCameraRef cameraRef, EdsFloat exposureCompensation);

| 参数 | 说明 | |---|---| | cameraRef | 相机句柄 | | exposureCompensation | 实时预览曝光补偿 |

7. 图像下载和处理

7.1 图像下载

下载图像

EdsError EdsDownload(EdsCameraRef cameraRef, EdsImageRef imageRef, EdsDownloadType inDownloadType);

参数说明

| 参数 | 类型 | 说明 | |---|---|---| | cameraRef | EdsCameraRef | 相机句柄 | | imageRef | EdsImageRef | 图像句柄 | | inDownloadType | EdsDownloadType | 下载类型 |

下载类型

| 下载类型 | 值 | 说明 | |---|---|---| | kEdsDownloadFullImage | 0 | 下载完整图像 | | kEdsDownloadThumbnail | 1 | 下载缩略图 | | kEdsDownloadPreview | 2 | 下载预览图像 |

使用示例

EdsError err = EdsDownload(cameraRef, imageRef, kEdsDownloadFullImage);
if (err != EDS_ERR_OK) {
  // 处理错误
}

7.2 图像格式转换

图像格式转换

EdsError EdsConvertImage(EdsImageRef imageRef, EdsImageRef *outImageRef, EdsImageCodec inCodec);

参数说明

| 参数 | 类型 | 说明 | |---|---|---| | imageRef | EdsImageRef | 输入图像句柄 | | outImageRef | EdsImageRef | 输出图像句柄 | | inCodec | EdsImageCodec | 输出图像格式 |

支持的图像格式

| 图像格式 | 值 | 说明 | |---|---|---| | kEdsImageCodec_Jpeg | 0 | JPEG 格式 | | kEdsImageCodec_Tiff | 1 | TIFF 格式 | | kEdsImageCodec_Png | 2 | PNG 格式 |

使用示例

EdsImageRef outImageRef;
EdsError err = EdsConvertImage(imageRef, &outImageRef, kEdsImageCodec_Jpeg);
if (err != EDS_ERR_OK) {
  // 处理错误
}

7.3 图像处理(裁剪、旋转、调整大小)

裁剪图像

EdsError EdsCropImage(EdsImageRef imageRef, EdsImageRef *outImageRef, EdsRect *inRect);

参数说明

| 参数 | 类型 | 说明 | |---|---|---| | imageRef | EdsImageRef | 输入图像句柄 | | outImageRef | EdsImageRef | 输出图像句柄 | | inRect | EdsRect | 裁剪区域 |

旋转图像

EdsError EdsRotateImage(EdsImageRef imageRef, EdsImageRef *outImageRef, EdsRotation inRotation);

参数说明

| 参数 | 类型 | 说明 | |---|---|---| | imageRef | EdsImageRef | 输入图像句柄 | | outImageRef | EdsImageRef | 输出图像句柄 | | inRotation | EdsRotation | 旋转角度 |

调整图像大小

EdsError EdsResizeImage(EdsImageRef imageRef, EdsImageRef *outImageRef, EdsSize *inSize);

参数说明

| 参数 | 类型 | 说明 | |---|---|---| | imageRef | EdsImageRef | 输入图像句柄 | | outImageRef | EdsImageRef | 输出图像句柄 | | inSize | EdsSize | 输出图像大小 |

使用示例

EdsImageRef outImageRef;
EdsRect rect = { 100, 100, 200, 200 };
EdsError err = EdsCropImage(imageRef, &outImageRef, &rect);
if (err != EDS_ERR_OK) {
  // 处理错误
}

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:佳能相机开发包Canon EDSDK 3.6.1-Windows为开发者提供了与佳能相机交互的强大工具。通过EDSDK API,开发者可以控制相机的设置、实时预览、远程拍摄并处理图像。本指南涵盖了EDSDK的关键知识点,包括:EDSDK简介、操作系统支持、示例代码、类图和时序图、相机控制、实时预览、图像下载和处理、事件通知、多相机支持和编程语言兼容性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

使用佳能相机官方sdk进行再次封装,实现如下功能: //python回调函数接口 typedef void (*PROPERTYEVENT_CALLBACK)(EdsUInt32 inEvent, EdsUInt32 inPropertyID, EdsUInt32 inParam); PROPERTYEVENT_CALLBACK g_property_callback[MAX_CAMERA]; typedef void (*OBJECTEVENT_CALLBACK)(EdsUInt32 inEvent); OBJECTEVENT_CALLBACK g_object_callback[MAX_CAMERA]; typedef void (*STATEEVENT_CALLBACK)(EdsUInt32 inEvent, EdsUInt32 inParam); STATEEVENT_CALLBACK g_state_callback[MAX_CAMERA]; //初始化 EDSDK_API EdsError Init(EdsUInt16 index); EDSDK_API EdsError UnInit(EdsUInt16 index); //拍照 EDSDK_API EdsError HalfShutterAFC(EdsUInt16 index); EDSDK_API EdsError TakePicture(EdsUInt16 index, char** path); EDSDK_API EdsError TakePictureNoAF(EdsUInt16 index, char** path); //录像 EDSDK_API EdsError StartVideo(EdsUInt16 index); EDSDK_API EdsError StopVideo(EdsUInt16 index, char** path); //取景器实时预览 EDSDK_API EdsError StartLiveView(EdsUInt16 index); EDSDK_API EdsError EndLiveView(EdsUInt16 index); EDSDK_API EdsError DownloadEvfImage(EdsUInt16 index, void** pointer, EdsUInt64* length); //调焦 EDSDK_API EdsError SetCameraFocus(EdsUInt16 index, short focus); EDSDK_API void SetFocusCount(EdsUInt16 index, long count); EDSDK_API unsigned int CalFocus(unsigned short objectDistance); EDSDK_API void AutoFocusInit(EdsUInt16 index); EDSDK_API void AutoFocus(EdsUInt16 index, unsigned int objectDistance); //属性 EDSDK_API EdsError SetProperty(EdsUInt16 index, EdsPropertyID propertyID, EdsInt32 property); EDSDK_API EdsError GetProperty(EdsUInt16 index, EdsPropertyID propertyID, EdsUInt32* data); EDSDK_API EdsError GetEvent(); //属性衍生 //切换拍照、录像模式 EDSDK_API EdsError SetDevMode(EdsUInt16 index, eCameraMode mode); EDSDK_API EdsError GetDevMode(EdsUInt16 index, EdsUInt16* mode); //拍摄AE模式 EDSDK_API EdsError SetMovieAEMode(EdsUInt16 index, eAEMode mode); EDSDK_API EdsError GetMovieAEMode(EdsUInt16 index, EdsUInt32* mode); //AF模式 EDSDK_API EdsError SetAFMode(EdsUInt16 index, eAFMode mode); EDSDK_API EdsError GetAFMode(EdsUInt16 index, EdsUInt32* mode); 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值