Android Bitmap Api总结和使用方法

Windows 10 下 DockerToolbox 安装全攻略:从下载到配置阿里云镜像加速 本文详细介绍了在Windows 10系统上安装和配置DockerToolbox的完整流程。从下载安装包、执行初步安装,到关键步骤——修改虚拟机存储路径以及配置阿里云镜像加速器,旨在帮助开发者,尤其是初次接触Docker的新手,快速搭建高效的本地容器开发环境,并解决国内镜像下载缓慢的痛点。 阅读详情
在学习Bitmap之前先学习一下Bitmap是怎么创建在,Bitmap的构造方法都是私有的,所以无法直接调用Bitmap的构造方法。我们只能通过BitmapFactory类和Bitmap.createBitmap来创建Bitmap。所以,我们要先了解BitmapFactory

BitmapFactory API总结
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//BitmapFactory Android4.4 API总结 2015年5月19日

//BitmapFactory 选项
public  static  class Options {
     public Options(){
        inDither = false;
        inScaled = true;
    }
     public Bitmap inBitmap;
     public  boolean inMutable;
     public  boolean inJustDecodeBounds;   //true时,只获取宽高
     public  int inSampleSize;             //缩放倍数,压缩图片内存大小 
     public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888;
     public  boolean inDither;
     public  int inDensity;
     public  int inTargetDensity;
     public  int inScreenDensity;
     public  boolean inScaled;
     public  boolean inPurgeable;
     public  boolean inInputShareable;
     public  boolean inPreferQualityOverSpeed;
     public  int outWidth;         //inJustDecodeBounds=true时,输出图片宽
     public  int outHeight;        //inJustDecodeBounds=true时,输出图片高
     public  String outMimeType;
     public  byte[] inTempStorage;
     private  native  void requestCancel();
     public  boolean mCancel;
     public  void requestCancelDecode(){
        mCancel = true;
        requestCancel();
    }
}

//通过文件路径创建Bitmap    
static Bitmap decodeFile( String pathName, Options opts);
static Bitmap decodeFile( String pathName);
//通过resources id创建Bitmap
//value: 一些图片值,如density等
static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, Options opts);
static Bitmap decodeResource(Resources res,  int id, Options opts);
static Bitmap decodeResource(Resources res,  int id);
//通过二进制创建Bitmap
//offset: 位置偏移
//length:data数组的读取长度
static Bitmap decodeByteArray( byte[] data,  int offset,  int length, Options opts);
static Bitmap decodeByteArray( byte[] data,  int offset,  int length);
//通过流文件创建Bitmap
static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts);
static Bitmap decodeStream(InputStream is);
//通过流文件描述符创建Bitmap
static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts);
static Bitmap decodeFileDescriptor(FileDescriptor fd);

BitmapFactory API使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

//decodeResource 使用方法
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.haha);

//decodeFile 使用方法
String SDCarePath = Environment.getExternalStorageDirectory().toString();
String filePath = SDCarePath +  "/" +  "haha.jpg";
Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null);

//decodeStream 使用方法
InputStream is;
is = context.getResources().openRawResource(R.drawable.frog);
mBitmap2 = BitmapFactory.decodeStream(is);

//decodeByteArray 使用方法
ByteArrayOutputStream os =  new ByteArrayOutputStream();

//(压缩格式, 压缩质量 0-100, 输出流)
src.compress(format, quality, os);
byte[] array = os.toByteArray();
return BitmapFactory.decodeByteArray(array,  0, array.length);

Bitmap createBitmap API总结
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//从原位图src复制出一个新的位图,和原始位图相同
public  static Bitmap createBitmap (Bitmap src)
//这个函数根据颜色数组来创建位图,注意:颜色数组的长度>=width*height
//此函数创建位图的过程可以简单概括为为:以width和height创建空位图,然后用指定的颜色数组colors来从左到右从上至下一次填充颜色。
//config是一个枚举,可以用它来指定位图“质量”。
public  static Bitmap createBitmap ( int[] colors,  int width,  int height, Bitmap.Config config) 
//offset      写入到pixels[]中的第一个像素索引值 
//stride      pixels[]中的行间距个数值(必须大于等于位图宽度) 
public  static Bitmap createBitmap ( int[] colors,  int offset,  int stride,  int width,  int height, Bitmap.Config config)
/*
从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
参数说明:
  Bitmap source:要从中截图的原始位图
  int x:    起始x坐标
  int y:    起始y坐标
    int width:  要截的图的宽度
    int height:要截的图的宽度
Bitmap.Config  config:一个枚举类型的配置,可以定义截到的新位图的质量
返回值:返回一个剪切好的Bitmap
 */

public  static Bitmap createBitmap (Bitmap source,  int x,  int y,  int width,  int height, Matrix m,  boolean filter)

//根据参数创建新位图
public  static Bitmap createBitmap ( int width,  int height, Bitmap.Config config)
//简单的剪切图像的方法,可以参考createBitmap
public  static Bitmap createBitmap (Bitmap source,  int x,  int y,  int width,  int height) 

Bitmap createBitmap及Bitmap. Config作用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private  static  final  int WIDTH =  50;
private  static  final  int HEIGHT =  50;
private  static  final  int STRIDE =  64;    // must be >= WIDTH
private Bitmap[] mBitmaps;
private  int[] mColors;

private  static  int[] createColors() {
     int[] colors =  new  int[STRIDE * HEIGHT];
     for ( int y =  0; y < HEIGHT; y++) {
         for ( int x =  0; x < WIDTH; x++) {
             int r = x *  255 / (WIDTH -  1);
             int g = y *  255 / (HEIGHT -  1);
             int b =  255 - Math.min(r, g);
             int a = Math.max(r, g);
            colors[y * STRIDE + x] = (a <<  24) | (r <<  16) | (g <<  8) | b;
        }
    }
     return colors;
}

public MyCreateBitmapView(Context context) {
     super(context);

    mColors = createColors();
     int[] colors = mColors;

    mBitmaps =  new Bitmap[ 4];
     // these three are initialized with colors[]
    mBitmaps[ 0] = Bitmap.createBitmap(colors,  0, STRIDE, WIDTH, HEIGHT,
                                      Bitmap.Config.ARGB_8888);
    mBitmaps[ 1] = Bitmap.createBitmap(colors,  0, STRIDE, WIDTH, HEIGHT,
                                      Bitmap.Config.RGB_565);
    mBitmaps[ 2] = Bitmap.createBitmap(colors,  0, STRIDE, WIDTH, HEIGHT,
                                      Bitmap.Config.ARGB_4444);

    mBitmaps[ 3] = Bitmap.createBitmap(WIDTH, HEIGHT,
                                      Bitmap.Config.ARGB_8888);
    mBitmaps[ 3].setPixels(colors,  0, STRIDE,  0,  0, WIDTH, HEIGHT);
}

@Override
protected  void onDraw(Canvas canvas) {
     super.onDraw(canvas);
     for ( int i =  0; i < mBitmaps.length; i++) {
        canvas.drawBitmap(mBitmaps[i],  0,  0, null);
        canvas.translate(mBitmaps[i].getHeight() +  5,   0);
    }
}




createBitmap的Matrix使用方法,背景缩放和透明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
int width =  600;
int height =  1024;

int widthDrawable = backGroundMap.getWidth();
int heightDrawable = backGroundMap.getHeight(); //获取背景图片的宽和高

float scaleWidth = ( float)width / widthDrawable;
float scaleHeight = ( float)height / heightDrawable;  //宽高比

Bitmap resizeBmp;
Matrix matrix =  new Matrix();

if(scaleWidth < scaleHeight) {
     float scale = scaleHeight; //取大的
    matrix.postScale(scale, scale); //缩放比例
     int xStart = ( int)(widthDrawable - widthDrawable / scale) /  2;

     /*
     * Bitmap source:要从中截图的原始位图
     * int x:起始x坐标
     * int y:起始y坐标
     * int width:要截的图的宽度
     * int height:要截的图的宽度
     * x+width must be <= bitmap.width()不然会报错
     * 原理是先截图再缩放,而不是先缩放再截图!!
     */

    resizeBmp = Bitmap.createBitmap(backGroundMap, xStart,  0, ( int)(widthDrawable / scale),
                                    heightDrawable, matrix, true);
}  else {
     float scale = scaleWidth;
    matrix.postScale(scale, scale);
     int yStart = ( int)(scaleHeight - scaleHeight / scale) /  2;
    resizeBmp = Bitmap.createBitmap(backGroundMap,  0, yStart, widthDrawable,
                                    ( int)(heightDrawable / scale), matrix, true);
}

//Bitmap 转化为 Drawable
BitmapDrawable drawable =  new BitmapDrawable(getResources(), resizeBmp);
setBackgroundDrawable(drawable);
//getBackground().setAlpha(150);    //设置背景透明度
             

Bitmap的优化:
Android分给应用的虚拟机堆栈只有8M,而加载图片时会很消耗资源,只要图片只够大,也就很容易把8M的内存消耗光,就 会出现OOM(Out Of Memory)的问题。所以,应用程序要很注意对内存的优化:
优化的方法如下:
1)主动回收Bitmap的内存
在Android中,很多关于UI的实现都是在Jni用C语言实现的。这样做主要是因为,对图片的处理要做大量的位操作,在C语言中,位操作更快,更容易。C语言的效率会更高,对于大量数据的处理可以更快。但是这就会出现一个问题,在Jni里面开辟的内存,数组,缓存等虚拟机是无法自动回收的。只能是Jni程序员在某个时间手动回收。也有可能是程序退出的时候才回收,但我们在程序使用的过程中会产生很多无用的Bitmap,这时,这些Bitmap就要我们在上层手动回收了:
在Android 的 Bitmap里就提供了主动回收的函数 recycle():
我们可能是返回,退出的时候回收,也可能在应用隐藏到后台的时候回收,也可以 在线程退出的时候回收,可以对Bitmap的临时变量做回收。可以在Bitmap转换后把原来的进行回收。 需要回收的地方可能很多,这里只是稍微提供一下思路
1
2
3
4
if(!bmp.isRecycle() ) {
    bmp.recycle()    //回收图片所占的内存
    system.gc()   //提醒系统及时回收
}


2)捕获异常
这里主要是要捕获分配Bitmap时会出现OutOfMemory异常,保证出现问题后,程序可以断续运行:
1
2
3
4
5
6
7
8
9
10
11
Bitmap bitmap = null;
try {
     // 实例化Bitmap
    bitmap = BitmapFactory.decodeFile(path);
}  catch (OutOfMemoryError e) {
     //
}
if (bitmap == null) {
     // 如果实例化失败 返回默认的Bitmap对象
     return defaultBitmapMap;
}
但是要注意: OutOfMemoryError是一个Error,如果是直接捕获Exception是无捕获的

3)压缩图片大小和内存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

//获得原始图片的大小 
BitmapFactory.Options options =  new BitmapFactory.Options();
//inJustDecodeBounds=true时只加载图片的宽高:options.outWidth 和 options.outHeight
options.inJustDecodeBounds = true;  
Bitmap bmp = BitmapFactory.decodeFile(path, options); /* 这里返回的bmp是null */

//缩小图片
int height = options.outHeight *  200 / options.outWidth;
//压缩图片容量,如果没有这句,只是缩小图片到指定尺寸,不会会影响内存
options.inSampleSize = options.outWidth /  200;  /*图片长宽方向缩小倍数*/
options.outWidth = 200;
options.outHeight = height; 
options.inJustDecodeBounds = false;

Bitmap bmp = BitmapFactory.decodeFile(path, options);
image.setImageBitmap(bmp);

4)通过临时缓存保存Bitmap
对于大用到Bitmap,和快速重复更新的情况下就要通过临时变量对保存Bitmap,避免重复加载和创建,例如ListView的里会不断刷新Bitmap,这里就要用在ListVeiw里用一个临时变量保存ListView的Bitmap,数据等。具体看一下ListView的优化



参考文章:
JVM高频面试基本问题与知识点整理 阅读详情

相关推荐

PyQtWebEngine安装避坑指南:快速解决ModuleNotFoundError

本文详细解析了PyQt5开发中常见的ModuleNotFoundError: No module named 'PyQt5.QtWebEngineWidgets'错误。核心原因是PyQt5 5.11版本后,网页引擎组件被独立为PyQtWebEngine包。文章对比了退回旧版本、独立安装及使用Conda等多种解决方案,并提供了针对Windows、macOS和Linux不同平台的实战安装指南与验证方法,帮助开发者快速解决依赖问题。

weixin_29056101的博客 427

Android 从源码分析Bitmap和BitmapFactory常用API,kotlin开发android教程

} mRecycled = true; } } isRecycled() 判断位图内存是否已经被回收。 checkRecycled 如果已经被回收,则抛出非法状态异常IllegalStateException。 /** This is called by methods that want to throw an exception if the bitmap has already been recycled. */ private void checkRecycled(String erro

m0_64382868的博客 783

ATAC-seq数据分析流程

Outline0. ATAC-seq原理0.1 染色体结构0.2 原理0.3 结果0.4 意义1. ATAC-seq数据分析流程1.1 上游分析(1)序列质控和比对(2)序列筛选1.2 下游分析1.3 进阶分析 0. ATAC-seq原理 0.1 染色体结构 0.2 原理 0.3 结果 0.4 意义 1. ATAC-seq数据分析流程 1.1 上游分析 (1)序列质控和比对 fastqc trim_golare bowtie2 mapping时要加上参数 --very-sensitive -X 2000

weixin_57830892的博客 1万+

【Android -- 学习笔记】Bitmap 的分析与使用

Bitmap 的分析与使用

Kevin Learn Android 731

企业微信获取code,URL详解

“https://open.weixin.qq.com/connect/oauth2/authorize?”+ “appid=”企业ID “&redirect_uri=”重定向路径+ “&agentid=”小程序AgentId+ “&response_type=code&scope=snsapi_userinfo&state=123&conn...

weixin_44804985的博客 8733

Java Web 图书管理系统的制作指南

实现对图书信息的增删改查(CRUD)操作。支持用户登录与权限管理。图书借阅与归还功能。系统管理员可以管理用户信息和图书库存。

Xiaoxin的博客 1629

Android Bitmap

android BItmap内存

qq_33512072的博客 1152

【立创EDA-PCB设计基础】1.嘉立创EDA专业版软件安装+PCB基本概念+原理图绘制

本文详解PCB基本概念以及实现MCU最小系统原理图的绘制(原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED)及嘉立创EDA专业版软件安装。为本专栏【立创EDA-PCB设计基础】后面章节实现PCB绘制做准备。

嵌入式阿齐Archie 3万+

Android 图片缓存之 Bitmap 详解

public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)//以src为原图,创建新的图像,指定新图像的高宽以及是否可变。public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。

qq_33209777的博客 994

Livox激光雷达传感器在Python3中的完整驱动程序:深入剖析OpenPyLivox库的实现和应用

当我们提到激光雷达或激光扫描技术时,Livox激光雷达传感器无疑是业界的佼佼者。尽管Livox提供了基于C++的官方软件和API,但现在,有了OpenPyLivox (OPL) 库,Python开发者们也能够轻松地接入和控制这些高级的激光雷达设备。

qq_38334677的博客 1002

【推荐100个unity插件】将UE的资源导出到unity使用—— Exporter for Unreal to/for Unity插件

Unreal to Unity导出器是一款帮助开发者将Unreal Engine项目转换为Unity的工具。文章详细介绍了使用步骤:1)安装虚幻引擎并创建项目;2)在Plugins文件夹中安装导出插件;3)导入UE资产到Content文件夹;4)配置导出参数并完成转换。文末推荐了多个Unity开发专栏,涵盖C#编程、2D/3D开发、特效制作等内容。作者向宇提供了博客地址,欢迎读者交流学习。该工具能有效提升项目迁移效率,适合需要跨引擎开发的用户使用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 849

安卓开发之Bitmap(一)

Bitmap是安卓开发中和图片相关的最常见的一个类。无论是图片的处理,加载,以及自定义控件,都和Bitmap息息相关。 Bitmap的使用并不是很困难,但是在使用过程中及其容易导致OOM,这也是让开发者最烦心的事之一。合理有效的使用Bitmap,避免OOM。 BitmapFactory

jialiang的博客 1955

API Streaming Failed 400 <400>InternalError.Algo.InvalidParameter input content must be a string解决方案

本文主要介绍了API Streaming Failed 400 <400> InternalError.Algo.InvalidParameter input content must be a string解决方案,希望能对使用vscode中cline的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

Android开发中一种原封不动地保存Bitmap数据的办法

最近一款软件需要保存图像时,不能有一丝一毫的失真,而且只限于本APP中打开。因此Bitmap.compress这种API是肯定不能用了。而网上的Android开发资料在保存Bitmap的时候都是用这个API的,千篇一律,没啥好借鉴的。所以我直接凭我的认知,写了几句代码实现了这个功能。 首先已知,安卓的Bitmap类提供了copyPixelsFromBuffer和copy...

轮子初级玩家 4691

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

谈谈安卓的Bitmap与Drawable

前言 搞安卓有些时间了,对图片老是存在一些疑惑:给View设置背景的原理是啥?啥是Drawable呢?Bitmap又是啥呢 ?Bitmap与Drawable有啥区别呢?整天看着这些熟悉有陌生的名词,当面对这些问题时却发现自己能说出来的却很少,,,, 今天就来谈谈自己的发现。 康康Drawable 首先用一句话来总结下Drawable吧:Drawable是对安卓中所有可绘制图像的抽象,也就是说安卓中的图像是以Drawable形式存在的。 为啥说安卓中的图像是以Drawable形式存在的? 这点就要从View展

dev晴天的博客 1908

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Bitmap API

1.简介Bitmap是Android系统中的图像处理的最重要类之一,通过bitmap可以获得图片的基本信息,以及对图片进行一系列的操作2.APIpublic boolean compress(CompressFormat format, int quality, OutputStream stream)把位图的压缩信息写入到指定的输出流.如果返回true,位图可以通过适当的输入流重建到BitmapF

子墨博客 6363

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

BitMap的getRowBytes和getByteCount()

getRowBytes():每一行所占的空间数。 getByteCount():BitMap的大小。 为什么在一般情况下不用bitmap.getByteCount()呢? 因为getByteCount要求的API版本较高,考虑到兼容性,一般使用上面的getRowBytes方法。 getRowBytes:Since API Level 1 getByteCount:Since API Level 12 源码: public final int getByteCount() { return g

Mrlove的博客 801

Android 计算Bitmap大小 getRowBytes和getByteCount()

今天使用LruCache写demo的时候,要获取Bitmap的大小 于是就用到了 return bitmap.getRowBytes() * bitmap.getHeight();// 获取大小并返回 //Bitmap所占用的内存空间数等于Bitmap的每一行所占用的空间数乘以Bitmap的行数 为什么不用bitmap.getByteCount()呢? 因为getByte

指尖上的人生 1万+

php返回图片给安卓_android 图片转换为drawable、bitmap 、file

1、Resources resources = mContext.getResources();Drawable drawable = resources.getDrawable(R.drawable.a);imageview.setBackground(drawable);2、Resources r = this.getContext().getResources();Inputstream i...

weixin_39793189的博客 151

[Android代码片段] 浅谈NDK修改Bitmap内容

(本文内容来源:http://www.eoeandroid.com/thread-303106-1-1.html 转载请注明出处!!!)           Android开发中,Bitmap该类的使用频繁度大家都应该都知道。基本可以说是到了每个App必备的地步。      但是我经常会碰到一个问题,就是在频繁的更改Bitmap内容的时候,如果总是创建,回收,肯定会造成性能上的浪费

Android小子的博客笔记 1405

Android中如何生成带圆角的Bitmap图片

有时候我们在开发Android应用时,会遇到圆角图片的问题,那么,我们如何在Android中用代码来生成圆角Bitmap图片呢?下面这段代码也许能够帮到你。 该方法主要用到了drawRoundRect来画圆角矩形,然后通过drawBitmap来画图片。 [code="java"] //生成圆角图片 public static Bitmap GetRoundedCornerBitmap...

紫色幽灵工作室 599

Android 11(API 级别 30)及以上版本中,将Bitmap保存到设备上

saveBitmapToMediaStore(getContentResolver(),bitmap,“图片名”,mimeType);

afufufufu的博客 1015

[Android代码片段] 浅谈NDK修改Bitmap内容,android模块化

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的。

2401_84140442的博客 996

android Bitmap getByteCount和getRowBytes

 转载出处:http://blog.youkuaiyun.com/chtnj/article/details/8793761 今天做图像缓存需要计算Bitmap的所占的内存空间,于是研究了下Bitmap关于内存占用的API 1、getRowBytes:Since API Level 1,用于计算位图每一行所占用的内存字节数。 2、getByteCount:Since API

AAA的博客 1386

Android中Bitmap和Drawable

为什么80%的码农都做不了架构师?>>> ...

weixin_33805557的博客 82

Android获取Bitmap的大小

最近刚进入新公司实习,在查看Android项目代码的时候看到以前的同事是这么写的代码获取Bitmap的大小: return bitmap.getRowBytes() * bitmap.getHeight();// 获取大小并返回 感觉很奇怪,为什么要这样计算而不是直接调用bitmap.getByteCount();呢? 查阅文档之后才知道,这个项目的minSDK=8,target

xuzhuaaron1的博客 2295
上一篇: Android 图片处理工具类汇总
下一篇: Android Paint API总结和使用方法
shell812
博客等级 码龄18年 202粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值