objective-cnsurlcgimagesource

CGImageSourceCreateWithURL return always nil


CGImageSourceCreateWithURL return always nil. I am passing [NSURL fileURLWithPath:getImagePath]. I have double check that image is there with url i am passing. Please find out the code below.

NSURL *imageURL = [self getImageAtTime:i withTitle:@"gifImage"];

if (!imageURL) {
    NSLog(@"imageURL is null");
    return;
}

CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, NULL);

if (source == NULL) {
    NSLog(@"Source is NULL");
}

CGImageDestinationAddImageFromSource(destination, source, i+1, (__bridge CFDictionaryRef)frameProperties);

Solution

  • while creating CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, NULL); i just forgot to specify property of image. Here is the below working code of CGImageSourceCreateWithURL

                NSURL *imageURL = [self getImageAtTime:i withTitle:@"gifImage"];
    
                if (!imageURL) {
                    NSLog(@"imageURL is null");
                    return;
                }
    
                CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, NULL);
    
                if (source == NULL) {
                    NSLog(@"Source is NULL");
                }
    
                //get all the metadata in the image
                NSDictionary *metadata = (__bridge NSDictionary *)CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
    
                //make the metadata dictionary mutable so we can add properties to it
                NSMutableDictionary *metadataAsMutable = [metadata mutableCopy];
    
                NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
                NSMutableDictionary *GPSDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyGPSDictionary]mutableCopy];
                NSMutableDictionary *RAWDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyRawDictionary]mutableCopy];
                NSMutableDictionary *GIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyGIFDictionary]mutableCopy];
    
                if(!EXIFDictionary)
                    EXIFDictionary = [[NSMutableDictionary dictionary] init];
    
                if(!GPSDictionary)
                    GPSDictionary = [[NSMutableDictionary dictionary] init];
    
                if(!RAWDictionary)
                    RAWDictionary = [[NSMutableDictionary dictionary] init];
    
                if(!GIFDictionary)
                    GIFDictionary = [[NSMutableDictionary dictionary] init];
    
    
                [GPSDictionary setObject:@"camera coord Latitude"
                                  forKey:(NSString*)kCGImagePropertyGPSLatitude];
                [GPSDictionary setObject:@"camera coord Longitude"
                                  forKey:(NSString*)kCGImagePropertyGPSLongitude];
                [GPSDictionary setObject:@"camera GPS Date Stamp"
                                  forKey:(NSString*)kCGImagePropertyGPSDateStamp];
                [GPSDictionary setObject:@"camera direction (heading) in degrees"
                                  forKey:(NSString*)kCGImagePropertyGPSImgDirection];
    
                [GPSDictionary setObject:@"subject coord Latitude"
                                  forKey:(NSString*)kCGImagePropertyGPSDestLatitude];
                [GPSDictionary setObject:@"subject coord Longitude"
                                  forKey:(NSString*)kCGImagePropertyGPSDestLongitude];
    
                [EXIFDictionary setObject:@"[S.D.] kCGImagePropertyExifUserComment"
                                   forKey:(NSString *)kCGImagePropertyExifUserComment];
    
                [EXIFDictionary setValue:@"69 m" forKey:(NSString *)kCGImagePropertyExifSubjectDistance];
    
                [GIFDictionary setObject:[NSNumber numberWithFloat:duration/frameCount] forKey:(NSString *)kCGImagePropertyGIFDelayTime];
    
    
                //Add the modified Data back into the image’s metadata
                [metadataAsMutable setObject:EXIFDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];
                [metadataAsMutable setObject:GPSDictionary forKey:(NSString *)kCGImagePropertyGPSDictionary];
                [metadataAsMutable setObject:RAWDictionary forKey:(NSString *)kCGImagePropertyRawDictionary];
                [metadataAsMutable setObject:GIFDictionary forKey:(NSString *)kCGImagePropertyGIFDictionary];
    
                CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metadataAsMutable);
    
                //            CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)frameProperties);
    
                CFRelease(source);