2013-08-07 36 views
8

Tôi có đoạn mã này để cung cấp cho hình ảnh của tôi một màu tôi cần:CGContextFillRects: không hợp lệ bối cảnh - Mục tiêu C

- (UIImage*)convertToMask: (UIImage *) image 
{ 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Draw a white background (for white mask) 
    CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
    CGContextFillRect(ctx, imageRect); 

    // Apply the source image's alpha 
    [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

    UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return outImage; 
} 

Tất cả mọi thứ hoạt động tốt theo quan điểm đầu tiên của tôi, nhưng khi tôi thêm này để xem chi tiết của tôi, nó cung cấp cho tôi lỗi này (nó vẫn hoạt động):

CGContextSetRGBFillColor: context không hợp lệ 0x0. Đây là một lỗi nghiêm trọng. Ứng dụng này, hoặc một thư viện mà nó sử dụng, đang sử dụng một ngữ cảnh không hợp lệ và do đó góp phần vào sự suy thoái tổng thể về độ ổn định và độ tin cậy của hệ thống. Thông báo này là lịch sự: vui lòng khắc phục sự cố này. Nó sẽ trở thành một lỗi nghiêm trọng trong bản cập nhật sắp tới.

CGContextFillRects: ngữ cảnh không hợp lệ 0x0. Đây là một lỗi nghiêm trọng. Ứng dụng hoặc thư viện này sử dụng, đang sử dụng ngữ cảnh không hợp lệ và là do đó góp phần làm giảm sự ổn định toàn bộ hệ thống và độ tin cậy . Thông báo này là lịch sự: vui lòng khắc phục sự cố này. Nó sẽ trở thành một lỗi nghiêm trọng trong bản cập nhật sắp tới.

Bất kỳ ý tưởng nào để loại bỏ lỗi này?

Cảm ơn.

CHỈNH SỬA:

Hành động được gọi là không có hình ảnh. Tôi dễ dàng sửa nó bằng cách thêm một điều kiện. Cảm ơn @ipmcc cho nhận xét.

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

    if (image != nil) { 

     UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
     CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 

     CGContextRef ctx = UIGraphicsGetCurrentContext(); 

     // Draw a white background (for white mask) 
     CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
     CGContextFillRect(ctx, imageRect); 

     // Apply the source image's alpha 
     [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

     UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 

     return outImage; 

    }else{ 

     return image; 

    } 
} 
+1

Câu hỏi giống hệt nhau thứ ba trong hai ngày, thứ hai hôm nay. –

+1

Ảnh của bạn có phải là nil' không? IIRC, ngữ cảnh sẽ là 'nil' nếu bạn vượt qua 0 cho chiều cao, chiều rộng hoặc tỷ lệ cho' UIGraphicsBeginImageContextWithOptions'. – ipmcc

+0

@ipmcc Vâng vì lý do nào đó, phương thức này được gọi một lần với hình ảnh nil. Đó là một sửa chữa dễ dàng bằng cách thêm một điều kiện. Nó làm việc trên quan điểm đầu tiên của tôi vì vậy điều này đã không đến với tâm trí của tôi. Cảm ơn – adam

Trả lời

8

Hãy thử điều này: Trong xcode thêm breakpoint biểu tượng để CGPostError. (Thêm điểm ngắt biểu tượng và loại trường Biểu tượng CGPostError)

Khi lỗi xảy ra, trình gỡ lỗi sẽ dừng thực thi mã và bạn có thể kiểm tra chồng phương thức cuộc gọi và kiểm tra tham số.

0
// UIImage+MyMask.h 

@interface UIImage (MyMask) 
- (UIImage*)convertToMask; 
@end 

// UIImage+MyMask.m 

@implementation UIImage (MyMask) 
- (UIImage*)convertToMask 
{ 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    CGRect imageRect = CGRectMake(0.0f, 0.0f, self.size.width, self.size.height); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Draw a white background (for white mask) 
    CGContextSetRGBFillColor(ctx, 1.0f, 1.0f, 1.0f, 0.9f); 
    CGContextFillRect(ctx, imageRect); 

    // Apply the source image's alpha 
    [image drawInRect:imageRect blendMode:kCGBlendModeDestinationIn alpha:1.0f]; 

    UIImage* outImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return outImage; 
} 
@end 

Sau đó, bạn có thể gọi như thế này (không cần phải kiểm tra nil):

UIImage *maskImage = [someImage convertToMask]; 
0

như tôi biết, bạn gọi UIGraphicsBeginImageContextWithOptions với một size.width hoặc size.height 0

chỉ thêm điểm ngắt biểu tượng vào CGPostError để kiểm tra.

Các vấn đề liên quan