преобразование uiimage в негативные цвета 2 раза вылетает приложение - PullRequest
2 голосов
/ 14 июля 2010

Я хочу показать анимацию с негативным изображением и обычным изображением.Для начала вызывается метод getPhoto, и пользователь может получить изображение из библиотеки или взять его с помощью камеры.

Когда анимация запущена, я хочу установить новое изображение, нозатем приложение вылетает.

-(IBAction) getPhoto:(id) sender {

    UIImagePickerController * picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;

    if((UIButton *) sender == choosePhotoBtn) {
        picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    } else {
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }

    [self presentModalViewController:picker animated:YES];

    [picker release];

}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

[picker dismissModalViewControllerAnimated:YES];

UIImage *negative = [self convertImageToNegative:[info objectForKey:@"UIImagePickerControllerOriginalImage"]];

imageView.animationImages = [NSArray arrayWithObjects: negative,[info objectForKey:@"UIImagePickerControllerOriginalImage"],nil];

imageView.animationDuration = 60.0; // seconds
imageView.animationRepeatCount = 1; // 0 = loops forever
[imageView startAnimating]; 

[negative release];
}

- (UIImage *)convertImageToNegative:(UIImage *)image{

UIGraphicsBeginImageContext(image.size);

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);

[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];

CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference);

CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor whiteColor].CGColor);

CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height));

UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();    

return returnImage;
}

Инструменты - CPU Sampler показывает, что использование составляет 100%.Как я могу предотвратить это?

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Этот метод даст вам перевернутое изображение изображения, которое вы указываете в параметре

-(UIImage *) getImageWithInvertedPixelsOfImage:(UIImage *)image {
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 2);
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeCopy);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeDifference);
    CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(),[UIColor whiteColor].CGColor);
    CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height));
    UIImage * result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}

Используйте его так:

yourImage.image = [self getImageWithInvertedPixelsOfImage:yourImage.image];
0 голосов
/ 15 августа 2016

Ответ Фернандо Сервантеса в Swift 2:

func getImageWithInvertedPixelsOfImage(image: UIImage) -> UIImage {
    let rect = CGRect(origin: CGPoint(), size: image.size)

    UIGraphicsBeginImageContextWithOptions(image.size, false, 2.0)
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), .Copy)
    image.drawInRect(rect)
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), .Difference)
    CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), UIColor.whiteColor().CGColor)
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect)

    let result = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return result
}
0 голосов
/ 15 июля 2010

Вы отпускаете изображение дважды.UIGraphicsGetImageFromCurrentImageContext () возвращает автоматически выпущенный объект, поэтому не отпускайте его перед выходом из функции.Пул автоматического выпуска сделает это за вас, когда выполнение вернется в цикл выполнения.

...