2012-04-01 4 views
0

In meiner App, wenn ich den UIImagePickerController verwende, verkleinere ich das Bild aus der Auswahl, um es von der sehr großen Größe zu reduzieren, mit der es beginnt. Auf dem iPhone und iPod Touch funktioniert es gut und es gibt geringe Verzögerungen. Da der iPad-Bildschirm jedoch viel größer ist, dauert es VIEL, VIEL länger, da ich ihn nach Pixeln skaliere.Die Größenänderung von Bildern nimmt viel Zeit in Anspruch?

Dies ist mein Code:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

    UIGraphicsBeginImageContext(screenSize); 
    [image drawInRect:CGRectMake(0,0,screenSize.width,screenSize.height)]; 
    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    [currentDefaults setObject:UIImagePNGRepresentation(newImage) forKey:@"newImageKey"]; 
    [currentDefaults synchronize]; 

    [popoverController dismissPopoverAnimated:YES]; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

Gibt es eine Möglichkeit, es schneller, um die Größe oder ihm eine andere Art und Weise zu tun, damit der Benutzer nicht die Verzögerung bemerken, wenn das System die großen Bilder Ändern der Größe?

Danke!

Antwort

3

Im Allgemeinen gibt es zwei Dinge, die ich Ihnen empfehlen kann. Die erste Möglichkeit ist die Verwendung von Blöcken, damit die Größenänderung und das Speichern über den Hauptthread erfolgt (dies erfordert iOS 4.0 und höher). Ihre Methode würde wie folgt aussehen (aus der Spitze von meinem Kopf und nicht kompiliert)

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
    CGFloat screenScale = [[UIScreen mainScreen] scale]; 
    CGSize screenSize = CGSizeMake(screenBounds.size.width * screenScale, screenBounds.size.height * screenScale); 

    UIGraphicsBeginImageContext(screenSize); 
    [image drawInRect:CGRectMake(0,0,screenSize.width,screenSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    [currentDefaults setObject:UIImagePNGRepresentation(newImage) forKey:@"newImageKey"]; 
    [currentDefaults synchronize]; 
}); 

[popoverController dismissPopoverAnimated:YES]; 
[picker dismissModalViewControllerAnimated:YES]; 
} 

Das zweite, was ich empfehlen, ist nicht das resultierende Bild zu speichern, in NSUserDefaults. NSUserDefaults soll nur ein kleiner Schlüssel-Wert-Speicher sein. Wenn Sie Bilder speichern möchten, speichern Sie sie mit NSFileManager auf dem Datenträger und speichern Sie den Pfad als Wert in NSUserDefaults.

+0

Dank dieser Code funktionierte großartig, aber können Sie mir ein Beispiel zeigen, was Sie für Ihren zweiten Tipp bedeuten? –

+0

Gibt es auch eine Möglichkeit, einen Rückruf für die Dispatch_async zu haben, so dass ich ein UIAlertView zeigen kann, wenn es fertig ist? –

+0

Nevermind, fand ich Antworten auf all diese Fragen, so dass es jetzt gut funktioniert! –