细说iOS中的颜色UIColor、CGColor、CIColor

37d3d539b6003af35f831c7c372ac65c1038b6f5

iOS中的颜色有UIColor、CGColor、CIColor三种,下面对三种颜色分别进行说明:

一、常用的UIColor

UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化。UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色,红色,透明色等,这些颜色的色彩空间也不尽相同(白色和黑色是kCGColorSpaceDeviceGray,红色的色彩空间是kCGColorSpaceDeviceRGB)。

此外UIColor还有两个重要的属性:一个是CGColor,一个是CIColor(5.0之后添加)。这两个属性就可以把UIColor,CGColor,CIColor三个对象联系起来了。

常用的设置颜色方法:

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;//指定RGB,参数是:红、绿、黄、透明度,范围是0-1

+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;//指定HSB,参数是:色调(hue),饱和的(saturation),亮度(brightness)

//当前的颜色改变透明度后的颜色:

UIColor *color = [UIColor redColor];

UIColor *cl = [color colorWithAlphaComponent:0.5f];

//自定义255的颜色值,将255转成0-1

CGFloat R  = (CGFloat) 225/255.0;

CGFloat G = (CGFloat) 66/255.0;

CGFloat B = (CGFloat) 88/255.0;

CGFloat alpha = (CGFloat) 1.0;

UIColor *myColorRGB = [ UIColor colorWithRed: R  green: G  blue: B  alpha: alpha  ];

self.tableView.backgroundColor = myColorRGB;

 

UIColor常用方法列表:

// Convenience methods for creating autoreleased colors

+ (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha;

+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

+ (UIColor *)colorWithCGColor:(CGColorRef)cgColor;

+ (UIColor *)colorWithPatternImage:(UIImage *)image;

+ (UIColor *)colorWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);

 

// Initializers for creating non-autoreleased colors

- (UIColor *)initWithWhite:(CGFloat)white alpha:(CGFloat)alpha;

- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;

- (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

- (UIColor *)initWithCGColor:(CGColorRef)cgColor;

- (UIColor *)initWithPatternImage:(UIImage*)image;

- (UIColor *)initWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);

 

// Some convenience methods to create colors.  These colors will be as calibrated as possible.

// These colors are cached.

+ (UIColor *)blackColor;      // 0.0 white

+ (UIColor *)darkGrayColor;   // 0.333 white

+ (UIColor *)lightGrayColor;  // 0.667 white

+ (UIColor *)whiteColor;      // 1.0 white

+ (UIColor *)grayColor;       // 0.5 white

+ (UIColor *)redColor;        // 1.0, 0.0, 0.0 RGB

+ (UIColor *)greenColor;      // 0.0, 1.0, 0.0 RGB

+ (UIColor *)blueColor;       // 0.0, 0.0, 1.0 RGB

+ (UIColor *)cyanColor;       // 0.0, 1.0, 1.0 RGB

+ (UIColor *)yellowColor;     // 1.0, 1.0, 0.0 RGB

+ (UIColor *)magentaColor;    // 1.0, 0.0, 1.0 RGB

+ (UIColor *)orangeColor;     // 1.0, 0.5, 0.0 RGB

+ (UIColor *)purpleColor;     // 0.5, 0.0, 0.5 RGB

+ (UIColor *)brownColor;      // 0.6, 0.4, 0.2 RGB

+ (UIColor *)clearColor;      // 0.0 white, 0.0 alpha

 

 

二、Core Gaphics框架中的CGColor

CGColor主要用于CoreGaphics框架之中,CGColor其实是个结构体,而我们通常在使用的CGColor的时候使用的是它的引用类型CGColorRef。CGColor主要由CGColorSapce和Color Components两个部分组成,同样的颜色组成,如果颜色空间不同的话,解析出来的结果可能会有所不同。这就像我们在处理图片数据的时候,如果把RGBA格式当成BGRA格式处理的结果可想而知。在Quartz 2D中CGColor常用来设置context的填充颜色,设置透明度等。

用法:

1、如何创建一个CGColor,最常用的函数是CGColorCreate,该函数有两个参数:

1) colorspace,指定CGColor对应的颜色空间,Quartz就会retain该对象,因此调用完之后你就可以安全的释放该对象。

2) components,一个CGFloat的数组,该数组的元素个数是指定色彩空间包含的颜色分量数n,加上对应的alpha值。

该函数该返回一个新创建的CGColorRef,当我们不再使用该对象的时候使用CGColorRelease函数释放该对象。

 

通过Core Library的文档,我们知道创建颜色有这么几个方法:

CGColorCreate

CGColorCreateCopy

CGColorCreateGenericGray

CGColorCreateGenericRGB

CGColorCreateGenericCMYK

CGColorCreateCopyWithAlpha

CGColorCreateWithPattern

再来看一下CGColorCreate:

CGColorRef CGColorCreate (

CGColorSpaceRef colorspace,

const CGFloat components[]

);

 

我们通过CGColorCreate就可以创建颜色。既然我们要用RGB表示颜色,那么colorspace这个参数我们就可以使用CGColorSpaceCreateDeviceRGB()。

 

2、获取CGColor的数据

在我们创建的时候传入两个重要的参数进去,当我们获取到了CGColorRef以后当然就可以拿到对应的ColorSpace以及Components。

1) 获取ColorSpace

通过CGColorGetColorSpace函数我们可以获取到当前CGColorRef对应的ColorSpace,该函数只接受一个参数就是你要获取ColorSpace的CGColorRef。下面请看一个简单的例子:

CGColorRef cgColor = [UIColor redColor].CGColor;

CGColorSpaceRef colorSpace = CGColorGetColorSpace(cgColor);

NSLog(@"color space: %@", colorSpace);

 

2) 获取Color Components

要获取到CGColorRef对应的颜色值,我们需要用到CGColorGetNumberOfComponents和CGColorGetComponents两个函数。我们先来看看两个函数的函数原型:

 

size_t CGColorGetNumberOfComponents (

CGColorRef color

);

const CGFloat * CGColorGetComponents (

CGColorRef color

);

第一个函数是获得CGColorRef的中包含的颜色组成部分的个数,第二个函数就是获取实际的颜色组成部分的数组,下面看一个小例子:

NSUInteger num = CGColorGetNumberOfComponents(cgColor);

const CGFloat *colorComponents = CGColorGetComponents(cgColor);

for (int i = 0; i < num; ++i) {

NSLog(@"color components %d: %f", i, colorComponents[i]);

//red is componentColors[0];

//green is componentColors[1];

//blue is componentColors[2];

//alpha is componentColors[3];

}

这个colorComponents参数是一个数组,带有4个数值:

float color[]={红色分量, 绿色分量, 蓝色分量, alpha分量};

这4个数值都是0-1区间,0表示黑(不发光),数字越大这种颜色的光线越强,alpha分量表示透明度。比如{1.0, 0, 0,1.0}就是纯红色而且完全不透明。

 

三、Core Image框架中的CIColor

CIColor主要是用于和Core Image框架中其他类,比如CIFilter,CIContext以及CIImage。今天我们主要关心的颜色值部分,CIColor中颜色值的范围是0.0-1.0之间,0.0代表该颜色分量为最小值,1.0代表改颜色分量为最大值。其中alpha值的范围也是0.0到1.0之间,0.0代表全透明,1.0代表完全不透明,同时CIColor的颜色分量通常都是没有乘以alpha值。

我们可以使用initWithCGColor:函数,通过CGColor创建一个CIColor。其中传入的CGColorRef对象可以使任何任何颜色空间,但是Core Image框架会在传入filter kernel之前把所有的颜色空间转换到core image工作颜色空间。core image工作颜色空间使用三个颜色分量加上一个alpha分量组成(其实就是kCGColorSpaceDeviceRGB),后面的例子中我们验证这一点。

 

常用方法列表:

/* Create a new color object. */

+ (CIColor *)colorWithCGColor:(CGColorRef)c;

/* Create a new color object.

It's created using the GenericRGB color space. To create a CIColor with a different color space, use +colorWithCGColor:. */

+ (CIColor *)colorWithRed:(CGFloat)r green:(CGFloat)g blue:(CGFloat)b alpha:(CGFloat)a;

+ (CIColor *)colorWithRed:(CGFloat)r green:(CGFloat)g blue:(CGFloat)b;

/* Create a new color object, 'representation' should be a string in one of

* the formats returned by the stringRepresentation method. */

+ (CIColor *)colorWithString:(NSString *)representation;

/* Initializer. */

- (id)initWithCGColor:(CGColorRef)c;

 

/* Return the number of color components (including alpha). */

- (size_t)numberOfComponents;

 

/* Return the color components (including alpha). */

- (const CGFloat *)components;

 

/* Return the alpha value of the color. */

- (CGFloat)alpha;

 

/* Return the color space object associated with the color. */

- (CGColorSpaceRef)colorSpace;

 

/* Return the (unpremultiplied) red, green or blue components of the color. */

- (CGFloat)red;

- (CGFloat)green;

- (CGFloat)blue;

 

/* Returns a formatted string with the components of the color. */

- (NSString *)stringRepresentation;

 

四、UIColor,CGColor,CIColor的区别和联系

1、UIColor的两个属性CGColor,CIColor

UIColor的CGColor总是有效的,不管它是通过CGColor,CIColor,还是其他方法创建的,CGColor属性都总是有效的;但是CIColor属性就不总是有效的,只有当UIColor是通过CIColor创建的时候,他才是有效的,否则访问该属性将会抛出异常,下面是例子:

 

// test init uicolor with CGColor

UIColor *color = [UIColor colorWithCGColor:[UIColor whiteColor].CGColor];

// CGColor property is always valid

NSLog(@"CGColor from UIColor %@", color.CGColor);

 

// don't use CIColor property

// This property throws an exception if the color object was not initialized with a Core Image color.

NSLog(@"CIColor from UIColor %@", color.CIColor);   // crush

 

2、UIColor使用CGColor初始化

当UIColor使用CGColor初始化的时候,所有CGColorRef包含的信息,都会被原封不动的保留,其中就包括Color space,而且通过下面的小例子我们还可以看到如果使用CGColor初始化UIColor的时候,UIColor其实是直接保留了一份这个CGColorRef对象。例子如下:

 

// test kCGColorSpaceDeviceCMYK

CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();

CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue

CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);

CGColorSpaceRelease(cmykSpace);

NSLog(@"colorCMYK: %@", colorCMYK);

// color with CGColor, uicolor will just retain it

UIColor *color = [UIColor colorWithCGColor:colorCMYK];

NSLog(@"CGColor from UIColor: %@", color.CGColor);

3、UIColor使用CIColor初始化

下面我们讨论一下当使用CIColor来初始化一个UIColor的时候,再去访问UIColor的CGColor属性的时候,我们会发现CGColor的color Space和设置CIColor的color space的是不完全一样的,在这个过程中CIColor会为我们做一个转换。下面我们分别看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三种颜色空间来初始化一个CIColor的时候,再去使用该CIColor去初始化一个UIColor,然后在去访问其CIColor属,CGColor属性,查看颜色空间并打印颜色信息。

  1. 使用kCGColorSpaceDeviceGray初始化CIColor

// test kCGColorSpaceDeviceGray

NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor);

CIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor];

NSLog(@"cicolor: %@", ciColor);

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

color = [UIColor colorWithCIColor:ciColor];

NSLog(@"color %@", color);

// Core Image converts all color spaces to the Core Image working color

// space before it passes the color space to the filter kernel.

// kCGColorSpaceDeviceGray ---> kCGColorSpaceDeviceRGB

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

NSLog(@"color's CGColor: %@", color.CGColor);

 

通过运行程序,我们看出来,如果使用一个kCGColorSpaceDeviceGray的颜色空间的CGColor来初始化CIColor的时候,我们可以看到CIColor的色彩空间一直是kCGColorSpaceDeviceGray,通过访问UIColor的CIColor属性,我们可以看到其颜色空间仍然是kCGColorSpaceDeviceGray,但是当访问UIColor的CGColor属性的时候,通过打印可以发现其色彩空间已经转变成了kCGColorSpaceDeviceRGB空间了,而颜色值也正确的从原来的颜色空间转换到了新的颜色空间。

  1. 使用kCGColorSpaceDeviceRGB初始化CIColor

//test kCGColorSpaceDeviceRGB

NSLog(@"CGColor red color:%@", [UIColor redColor].CGColor);

CIColor *ciColor = [CIColor colorWithCGColor:[UIColor redColor].CGColor];

NSLog(@"cicolor: %@", ciColor);

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

UIColor *color = [UIColor colorWithCIColor:ciColor];

NSLog(@"color %@", color);

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

NSLog(@"color's CGColor: %@", color.CGColor);

 

整个过程中CIColor,以及通过UIColor的CGColor和CIColor属性访问到的值,打印出来我们可以发现它们都是kCGColorSpaceDeviceRGB空间的。

 

4、使用kCGColorSpaceDeviceCMYK初始化CIColor

// test kCGColorSpaceDeviceCMYK

CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK();

NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace));

CGFloat cmykValue[] = {1, 1, 0, 0, 1};      // blue

CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue);

CGColorSpaceRelease(cmykSpace);

NSLog(@"colorCMYK: %@", colorCMYK);

ciColor = [CIColor colorWithCGColor:colorCMYK];

NSLog(@"cicolor: %@", ciColor);     // in fact,the color value of CIColor has converted to RGB Colorspace

NSLog(@"cicolor colorspace: %@", ciColor.colorSpace);

color = [UIColor colorWithCIColor:ciColor];

NSLog(@"UIColor with CIColor: %@", color);

NSLog(@"cicolor from UIColor: %@", color.CIColor);

NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace);

// when UIColor init with CIColor, UIColor's CGColor will convert other colorspace to kCGColorSpaceDeviceRGB

NSLog(@"cgcolor from UIColor: %@", color.CGColor);

 

整个过程中,我们通过运行同样可以发现,当我们用一个CMYK颜色空间的CGColor来初始化CIColor的时候,CIColor的颜色空间依然是CMYK,但是颜色值已经转换成RGB的颜色值。当使用该CIColor创建一个UIColor的时候,我们再通过CIColor和CGColor属性打印信息的时候,我们会发现CIColor的色彩空间依然是CMYK,但是CGColor打印所得到的信息说明它已经被转换成RGB空间了。

 

 

扩展:

 

常用宏

#define RGBA_COLOR(R, G, B, A) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:A]

#define RGB_COLOR(R, G, B) [UIColor colorWithRed:((R) / 255.0f) green:((G) / 255.0f) blue:((B) / 255.0f) alpha:1.0f]

//16进制颜色

#define UIColorFromHex(hex) [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16))/255.0 green:((float)((hex & 0xFF00) >> 8))/255.0 blue:((float)(hex & 0xFF))/255.0 alpha:1.0]

 

iOS获取图片UIImage颜色均值AverageColor

- (UIColor *)averageColorForImage:(UIImage*)image {

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char rgba[4];

CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image.CGImage);

CGColorSpaceRelease(colorSpace);

CGContextRelease(context);

if(rgba[3] > 0) {

CGFloat alpha = ((CGFloat)rgba[3])/255.0;

CGFloat multiplier = alpha/255.0;

return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier

green:((CGFloat)rgba[1])*multiplier

blue:((CGFloat)rgba[2])*multiplier

alpha:alpha];

}

else {

return [UIColor colorWithRed:((CGFloat)rgba[0])/255.0

green:((CGFloat)rgba[1])/255.0

blue:((CGFloat)rgba[2])/255.0

alpha:((CGFloat)rgba[3])/255.0];

}

}

 

使用颜色创建图片:

+ (UIImage *) createImageWithColor: (UIColor *) color

{

CGRect rect=CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);

UIGraphicsBeginImageContext(rect.size);

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetFillColorWithColor(context, [color CGColor]);

CGContextFillRect(context, rect);

UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return theImage;

}

 

获取颜色透明度:

 

- (CGFloat) alphaForColor:(UIColor*)color {

CGFloat r, g, b, a, w, h, s, l;

BOOL compatible = [color getWhite:&w alpha:&a];

if (compatible) {

return a;

} else {

compatible = [color getRed:&r green:&g blue:&b alpha:&a];

if (compatible) {

return a;

} else {

[color getHue:&h saturation:&s brightness:&l alpha:&a];

return a;

}

}

}

 

判断颜色深浅:

 

-(BOOL)isDarkColor:(UIColor *)newColor{

if ([self alphaForColor: newColor]<10e-5) {

return YES;

}

const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);

CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;

if (colorBrightness < 0.5){

NSLog(@"Color is dark");

return YES;

}

else{

NSLog(@"Color is light");

return NO;

}

}

 

取得图片某一像素点的颜色值:

- (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {

UIColor* color = nil;

CGImageRef inImage = image.CGImage;

CGContextRef cgctx = [self createARGBBitmapContextFromImage:

inImage];

if (cgctx == NULL) {

return nil; /* error */

}

size_t w = CGImageGetWidth(inImage);

size_t h = CGImageGetHeight(inImage);

CGRect rect = {{0,0},{w,h}};

CGContextDrawImage(cgctx, rect, inImage);

unsigned char* data = CGBitmapContextGetData (cgctx);

if (data != NULL) {

int offset = 4*((w*round(point.y))+round(point.x));

int alpha =  data[offset];

int red = data[offset+1];

int green = data[offset+2];

int blue = data[offset+3];

color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:

(blue/255.0f) alpha:(alpha/255.0f)];

}

CGContextRelease(cgctx);

if (data) {

free(data);

}

return color;

}

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

void *bitmapData;

int bitmapByteCount;

int bitmapBytesPerRow;

size_t pixelsWide = CGImageGetWidth(inImage);

size_t pixelsHigh = CGImageGetHeight(inImage);

bitmapBytesPerRow = (pixelsWide * 4);

bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL){

fprintf(stderr, "Error allocating color space\n");

return NULL;

}

bitmapData = malloc( bitmapByteCount );

if (bitmapData == NULL){

fprintf (stderr, "Memory not allocated!");

CGColorSpaceRelease( colorSpace );

return NULL;

}

context = CGBitmapContextCreate (bitmapData,pixelsWide,pixelsHigh,8,bitmapBytesPerRow,colorSpace,kCGImageAlphaPremultipliedFirst);

if (context == NULL){

free (bitmapData);

fprintf (stderr, "Context not created!");

}

CGColorSpaceRelease( colorSpace );

return context;

}

 

如何判断两个颜色是否相等

前面提到一点,不管UIColor使用CIColor,CGColor还是其他方式初始化的,其CGColor属性都是可用的。CoreGraphics中提供一个方法可以判断两个CGColor是否相等,因此我们可以通过判断两个UIColor是否相等,下面是看一个简单的例子:

// judge two CGColor is equal

if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {

NSLog(@"The two CGColor is equal!");

}

else {

NSLog(@"The two CGColor is not equal!");

}

if (CGColorEqualToColor([UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {

NSLog(@"The two CGColor is equal!");

}

else {

NSLog(@"The two CGColor is not equal!");

}

例子中第一部分是判断两个白色的UIColor是否相等,虽然都是白色,但是颜色空间是不一样的,通过运行我们可以发现,打印出“The two CGColor is not equal!”。例子的第二部分简单的创建了两个RGB空间的UIColor,运行程序可以看出,这两种颜色是相同的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明 YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明YOLO高分设计资源源码,详情请查看资源内容使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值