UIImage Контекстное редактирование вызывает SIGABRT / EXC_BAD_ACCESS - PullRequest
1 голос
/ 31 июля 2011

У меня довольно странное поведение в моем коде.Я хочу редактировать некоторые графические вещи в UIGraphicsImageContext.Иногда это работает, иногда нет.Я отсоединяю функцию обработки изображений к новому потоку, который выглядит следующим образом:

-(void)process:(SEL)function withObject:(id)sender {
UIActivityIndicatorView  *av = [[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
av.frame = CGRectMake(round((self.view.frame.size.width - 50) / 2), 
                      round((self.view.frame.size.height - 50) / 2), 50, 50);
av.tag  = kActivityTag;
[self.view addSubview:av];
[av startAnimating];
[self enableControls:NO];
[NSThread detachNewThreadSelector:function toTarget:self withObject:sender];

Перед тем, как одна из следующих функций вызывает функцию процесса:

-(void)imageColorTintChanged:(id)sender {
[self process:@selector(tint:) withObject:sender];}

-(void)tint:(id)sender {
@synchronized(image) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    float f       = ((UISlider *)sender).value;
    NSInteger tag = ((UISlider *)sender).tag;
    if (tag == 0) {
        redTint = f;
    } else if (tag == 1) {
        greenTint = f;
    } else if (tag == 2) {
        blueTint = f;
    }
    previewImage = [ImageUtil colorizeImage:image color:[UIColor colorWithRed:redTint green:greenTint blue:blueTint alpha:1.0]];
    [imageView setImage:previewImage];
    [self processDidFinish];
    [pool release];
}}

Наконец,мое графическое редактирование начинается здесь в новой теме:

+ (UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor {
if (baseImage) {
    @synchronized (baseImage) {
        UIGraphicsBeginImageContext(baseImage.size);  // CRASH!!

        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGRect area = CGRectMake(0.0f, 0.0f, baseImage.size.width, baseImage.size.height);

        CGContextTranslateCTM(ctx, 0.0, baseImage.size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);    

        [theColor set];
        CGContextFillRect(ctx, area);

        CGContextSetBlendMode(ctx, kCGBlendModeMultiply);

        CGContextDrawImage(ctx, area, baseImage.CGImage);

        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        return newImage;
    }
}
return baseImage;

Большую часть времени происходит сбой в этой строке:

UIGraphicsBeginImageContext (baseImage.size);

Что можетэто может быть?Потоковая вещь?Заранее спасибо.

РЕДАКТИРОВАТЬ:

Ну, я сделал тест монитора активности на приборах и по какой-то причине он говорит, что утечки памяти нет, но реальное использование памяти до некоторой степени возрастает до 53 МБобработка изображения, а затем он падает.Возможно ли, что это просто какая-то ошибка «Я использую слишком много памяти»?

1 Ответ

1 голос
/ 31 июля 2011

Из Справочник по функциям UIKit , относительно UIGraphicsBeginImageContext():

Эту функцию следует вызывать только из основного потока приложения.

Вам нужно создать здесь CGBitmapContext.

...