Сохранить CGImageRef в PNG файл? (ARC вызвал?) - PullRequest
1 голос
/ 22 ноября 2011

Этот код работал, но я думаю, что новый ARC XCode, возможно, убил его

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    CGDirectDisplayID displayID = CGMainDisplayID();
    CGImageRef image = CGDisplayCreateImage(displayID); //this is a screenshot (works fine)
    [self savePNGImage:image path:@"~/Desktop"];
}


-(void)savePNGImage:(CGImageRef)imageRef path:(NSString *)path {
    NSURL *outURL = [[NSURL alloc] initFileURLWithPath:path]; 
    //here xcode suggests using __bridge for CFURLRef?
    CGImageDestinationRef dr = CGImageDestinationCreateWithURL ((__bridge CFURLRef)outURL, (CFStringRef)@"public.png" , 1, NULL);    
    CGImageDestinationAddImage(dr, imageRef, NULL);
    CGImageDestinationFinalize(dr);
}

Этот код возвращает ошибку:

ImageIO: назначение изображения CGImageDestinationAddImage параметр nil

, что, как я полагаю, означает, что CGImageDestinationRef создается неправильно. Я не смог найти реализацию этого, что новый Xcode не дает ту же ошибку, что я делаю неправильно?

1 Ответ

4 голосов
/ 22 ноября 2011

Код, который вы разместили, не будет работать ни с ARC, ни без него, потому что вам нужно расширить тильду в имени пути перед его передачей.

Код, который вы опубликовали, также пропускал предметы, возвращенные CGDisplayCreateImage и CGImageDestinationCreateWithURL. Вот пример, который работает и не течет:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    CGDirectDisplayID displayID = CGMainDisplayID();
    CGImageRef imageRef = CGDisplayCreateImage(displayID); //this is a screenshot (works fine)

    NSString *path = [@"~/Desktop/public.png" stringByExpandingTildeInPath];
    [self savePNGImage:imageRef path:path];

    CFRelease(imageRef);
}

- (void)savePNGImage:(CGImageRef)imageRef path:(NSString *)path
{
    NSURL *fileURL = [NSURL fileURLWithPath:path]; 
    CGImageDestinationRef dr = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypePNG , 1, NULL);

    CGImageDestinationAddImage(dr, imageRef, NULL);
    CGImageDestinationFinalize(dr);

    CFRelease(dr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...