3
votes

I need to read the properties of an image without load or download it. In fact i have implemented a simple method that use the CGImageSourceCreateWithUrl for accomplish this. My problem is that it is returning always error because seems that the imageSource is null. So what can i do for fix it? In the NSURL object i pass urls like: "http://www.example.com/wp-content/uploads/image.jpg" but also ALAssets library Id used to retrieve images inside the phone like "assets-library://asset/asset.JPG?id=E5F41458-962D-47DD-B5EF-E606E2A8AC7A&ext=JPG". This is my method:

-(NSString *) getPhotoInfo:(NSString *)paths{
  NSString *xmlList = @“test”;

  NSURL * imageFileURL = [NSURL fileURLWithPath:paths];
  NSLog(@"imageFileURL %@", imageFileURL);
  CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)(imageFileURL), NULL);
  if (imageSource == NULL) {
    // Error loading image
    NSLog(@"Error loading image");
  }
  CGFloat width = 0.0f, height = 0.0f;
  CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, NULL);
  NSLog(@"image source %@", imageSource);

  return xmlList;
}

I have saw this posts for try to fix it but nothing seems working:

In my project ARC is enabled.

Thanks

2

2 Answers

5
votes

If you are passing the string "http://www.example.com/wp-content/uploads/image.jpg” to -fileURLWithPath: it’s going to return nil, because that string is sure not a file path, it’s a URL string.

Think of -fileURLWithPath: as just prepending the string you pass in with “file://localhost/“...so you’d end up with a URL that looks like "file://localhost/http://www.example.com/wp-content/uploads/image.jpg”. That’s not good.

You need to call [NSURL URLWithString:paths] if you’re going to be passing in entire URL strings, not just a filesystem path strings.

3
votes

Working with "assets-library://asset/asset.JPG?id.........., try this code

-(UIImage*)resizeImageToMaxSize:(CGFloat)max anImage:(UIImage*)anImage  
{

     NSData * imgData = UIImageJPEGRepresentation(anImage, 1);
 CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)imgData, NULL);
 if (!imageSource)
     return nil;

 CFDictionaryRef options = (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
                                             (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
                                             (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
                                             (id)[NSNumber numberWithFloat:max], (id)kCGImageSourceThumbnailMaxPixelSize,
                                             nil];
 CGImageRef imgRef = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options);

 UIImage* scaled = [UIImage imageWithCGImage:imgRef];
  //these lines might be skipped for ARC enabled
 CGImageRelease(imgRef);
 CFRelease(imageSource);

 return scaled; }