美文网首页
iOS 从Xcode中Images.xcassets导出合适的图

iOS 从Xcode中Images.xcassets导出合适的图

作者: 青椒辣不辣 | 来源:发表于2021-01-12 17:31 被阅读0次

    需求:拿到项目中的图片在别的地方使用

    image.png

    使用工具
    下载下来cartool以后打开项目配置处理
    其中Assets.car为你的Xcode项目目录中:Products->***.app->显示包内容->Assets.car

    image.png

    运行成功拿到

    image.png

    不能获取成功的处理方案
    处理后的main.m

    #import <Foundation/Foundation.h>
    
    typedef enum _kCoreThemeIdiom {
        kCoreThemeIdiomUniversal,
        kCoreThemeIdiomPhone,
        kCoreThemeIdiomPad,
        kCoreThemeIdiomTV,
        kCoreThemeIdiomCar,
        kCoreThemeIdiomWatch,
        kCoreThemeIdiomMarketing
    } kCoreThemeIdiom;
    
    typedef NS_ENUM(NSInteger, UIUserInterfaceSizeClass) {
        UIUserInterfaceSizeClassUnspecified = 0,
        UIUserInterfaceSizeClassCompact     = 1,
        UIUserInterfaceSizeClassRegular     = 2,
    };
    
    @interface CUICommonAssetStorage : NSObject
    
    -(NSArray *)allAssetKeys;
    -(NSArray *)allRenditionNames;
    
    -(id)initWithPath:(NSString *)p;
    
    -(NSString *)versionString;
    
    @end
    
    @interface CUINamedImage : NSObject
    
    @property(readonly) CGSize size;
    @property(readonly) CGFloat scale;
    @property(readonly) kCoreThemeIdiom idiom;
    @property(readonly) UIUserInterfaceSizeClass sizeClassHorizontal;
    @property(readonly) UIUserInterfaceSizeClass sizeClassVertical;
    
    -(CGImageRef)image;
    
    @end
    
    @interface CUIRenditionKey : NSObject
    @end
    
    @interface CUIThemeFacet : NSObject
    
    +(CUIThemeFacet *)themeWithContentsOfURL:(NSURL *)u error:(NSError **)e;
    
    @end
    
    @interface CUICatalog : NSObject
    
    @property(readonly) bool isVectorBased;
    -(id)initWithURL:(NSURL *)URL error:(NSError **)error;
    -(id)initWithName:(NSString *)n fromBundle:(NSBundle *)b;
    -(id)allKeys;
    -(id)allImageNames;
    -(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s;
    -(CUINamedImage *)imageWithName:(NSString *)n scaleFactor:(CGFloat)s deviceIdiom:(int)idiom;
    -(NSArray *)imagesWithName:(NSString *)n;
    
    @end
    
    void CGImageWriteToFile(CGImageRef image, NSString *path)
    {
        CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path];
        CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
        CGImageDestinationAddImage(destination, image, nil);
        if (!CGImageDestinationFinalize(destination)) {
            NSLog(@"Failed to write image to %@", path);
        }
        CFRelease(destination);
    }
    NSString *idiomSuffixForCoreThemeIdiom(kCoreThemeIdiom idiom)
    {
        switch (idiom) {
            case kCoreThemeIdiomUniversal:
                return @"";
                break;
            case kCoreThemeIdiomPhone:
                return @"~iPhone";
                break;
            case kCoreThemeIdiomPad:
                return @"~iPad";
                break;
            case kCoreThemeIdiomTV:
                return @"~tv";
                break;
            case kCoreThemeIdiomCar:
                return @"~CarPlay";
                break;
            case kCoreThemeIdiomWatch:
                return @"~watch";
                break;
            case kCoreThemeIdiomMarketing:
                return @"~marketing";
                break;
            default:
                break;
        }
        
        return @"";
    }
    NSString *sizeClassSuffixForSizeClass(UIUserInterfaceSizeClass sizeClass)
    {
        switch (sizeClass){
            case UIUserInterfaceSizeClassCompact:
                return @"C";
                break;
            case UIUserInterfaceSizeClassRegular:
                return @"R";
                break;
            default:
                return @"A";
        }
    }
    NSMutableArray *getImagesArray(CUICatalog *catalog, NSString *key)
    {
        NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:5];
        for (NSNumber *scaleFactor in @[@1, @2, @3]){
            CUINamedImage *image = [catalog imageWithName:key scaleFactor:scaleFactor.doubleValue];
            if (image && image.scale == scaleFactor.floatValue) [images addObject:image];
        }
        return images;
    }
    void exportCarFileAtPath(NSString * carPath, NSString *outputDirectoryPath)
    {
        NSError *error = nil;
        outputDirectoryPath = [outputDirectoryPath stringByExpandingTildeInPath];
        
        /*
        CUIThemeFacet *facet = [CUIThemeFacet themeWithContentsOfURL:[NSURL fileURLWithPath:carPath] error:&error];
        
        CUICatalog *catalog = [[CUICatalog alloc] init];
        
        // Override CUICatalog to point to a file rather than a bundle
        [catalog setValue:facet forKey:@"_storageRef"];
        */
        
        CUICatalog *catalog = nil;
        if ([CUICatalog instancesRespondToSelector:@selector(initWithURL:error:)]) {
            /* If CUICatalog has the URL API (Mojave), use it. */
            catalog = [[CUICatalog alloc] initWithURL:[NSURL fileURLWithPath:carPath] error:&error];
        } else {
            CUIThemeFacet *facet = [CUIThemeFacet themeWithContentsOfURL:[NSURL fileURLWithPath:carPath] error:&error];
            [catalog setValue:facet forKey:@"_storageRef"];
            /* Override CUICatalog to point to a file rather than a bundle */
                    [catalog setValue:facet forKey:@"_storageRef"];
        }
        NSCAssert(!error, @"Error attempting to open asset catalog (%@): %@", carPath, error);
        
        
        /* CUICommonAssetStorage won't link */
        CUICommonAssetStorage *storage = [[NSClassFromString(@"CUICommonAssetStorage") alloc] initWithPath:carPath];
        
        
        for (NSString *key in [storage allRenditionNames]){
            printf("%s\n", [key UTF8String]);
            NSArray* pathComponents = [key pathComponents];
            if (pathComponents.count > 1){
                // Create subdirectories for namespaced assets (those with names like "some/namespace/image-name")
                NSArray* subdirectoryComponents = [pathComponents subarrayWithRange:NSMakeRange(0, pathComponents.count - 1)];
                
                NSString* subdirectoryPath = [outputDirectoryPath copy];
                for (NSString* pathComponent in subdirectoryComponents)
                {
                    subdirectoryPath = [subdirectoryPath stringByAppendingPathComponent:pathComponent];
                }
                
                [[NSFileManager defaultManager] createDirectoryAtPath:subdirectoryPath
                                          withIntermediateDirectories:YES
                                                           attributes:nil
                                                                error:&error];
            }
            
            NSMutableArray *images = getImagesArray(catalog, key);
            for( CUINamedImage *image in images ){
                if(CGSizeEqualToSize(image.size, CGSizeZero)) printf("\tnil image?\n");
                else{
                    CGImageRef cgImage = [image image];
                    NSString *idiomSuffix = idiomSuffixForCoreThemeIdiom(image.idiom);
                    
                    NSString *sizeClassSuffix = @"";
                    
                    if (image.sizeClassHorizontal || image.sizeClassVertical)
                    {
                        sizeClassSuffix = [NSString stringWithFormat:@"-%@x%@", sizeClassSuffixForSizeClass(image.sizeClassHorizontal), sizeClassSuffixForSizeClass(image.sizeClassVertical)];
                    }
                    
                    NSString *scale = image.scale > 1.0 ? [NSString stringWithFormat:@"@%dx", (int)floor(image.scale)] : @"";
                    NSString *name = [NSString stringWithFormat:@"%@%@%@%@.png", key, idiomSuffix, sizeClassSuffix, scale];
                    printf("\t%s\n", [name UTF8String]);
                    if( outputDirectoryPath )
                        CGImageWriteToFile(cgImage, [outputDirectoryPath stringByAppendingPathComponent:name]);
                }
            }
        }
    }
    
    int main(int argc, const char * argv[]){
        @autoreleasepool {
            if (argc < 2){
                printf("Usage: cartool <path to Assets.car> [outputDirectory]\n");
                return -1;
            }
            exportCarFileAtPath([NSString stringWithUTF8String:argv[1]], argc > 2 ? [NSString stringWithUTF8String:argv[2]] : nil);
        }
        return 0;
    }
    
    ``

    相关文章

      网友评论

          本文标题:iOS 从Xcode中Images.xcassets导出合适的图

          本文链接:https://www.haomeiwen.com/subject/nijeaktx.html