2012-02-11 7 views
1

이미지의 원시 픽셀에 액세스하려고하지만 실제로 계속 붙어있는 문제가 계속 발생합니다. 나는 iPhone 프로그래밍에 익숙하지 않기 때문에 정말 간단 할 수도 있습니다 ...iPhone 데이터 프로그래밍을위한 CFDataRef 및 픽셀 데이터

여기에있는 클래스는 이미지에서 CGImageRef을 사용하고 개별 픽셀을 봅니다. 여기 내 코드는

헤더 파일 :

#import <QuartzCore/QuartzCore.h> 
#import <QuartzCore/QuartzCore.h> 
#import <CoreImage/CoreImage.h> 


@interface GraphingView : UIControl 
{ 
@private 
    CAShapeLayer *shapeLayer;  
    CGImageRef pixelData; 
} 

@property(assign) CGImageRef pixelData; 
@end 

그리고 내 구현 파일 :

#import "GraphingView.h" 
#import "iSpectrumViewController.h" 

@implementation GraphingView 

@synthesize pixelData; 
- (void)awakeFromNib 
{ 
    // set up a rounded border 
    CALayer *layer = [self layer]; 

    // clear the view's background color so that our background 
    // fits within the rounded border 
    CGColorRef backgroundColor = [self.backgroundColor CGColor]; 
    self.backgroundColor = [UIColor clearColor]; 
    layer.backgroundColor = backgroundColor; 


    shapeLayer = [CAShapeLayer layer];  

    [self setNeedsDisplay]; 
} 

- (void)drawRect:(CGRect)rect 
{ 

} 

- (void)updateGraph 
{ 
    // This is where my problem is: 
    // Whenever the next line is executed the application stops working. It works fine in the setPixelData 
    // down below. 
    CFDataRef pixelRef = CGDataProviderCopyData(CGImageGetDataProvider(pixelData)); 
    CFIndex byteSize = CFDataGetLength(pixelRef); 
    int intByteSize = (int) byteSize; 
    NSLog(@"Number of Bytes contained %i",intByteSize); 

    //Then get a pointer to the data so the information can be accessed 
    const UInt8 *pixelPtr = CFDataGetBytePtr(pixelRef); 


    // Do some drawing here using the data obtained from the image... 

    [shapeLayer setPath:path]; 
    [shapeLayer setNeedsDisplay]; 
    CFRelease(path);  
} 

-(void)setPixelData:(CGImageRef)pixelImage 
{ 
    //This code takes the CGImage from my image and copies it to the pixelData CGImageRef defined in the header file 


    //This gets the CFDataRef from the CGImage so the pixel information is available 
    CFDataRef PixelCopy = CGDataProviderCopyData(CGImageGetDataProvider(pixelImage)); 
    CFIndex byteSize = CFDataGetLength(PixelCopy); 
    int intByteSize = (int) byteSize; 
    NSLog(@"Number of Bytes contained %i",intByteSize); 

    pixelData = CGImageCreateCopy(pixelImage); 
    [self updateGraph]; 

} 
@end 

내가 가진 문제는 다음과 같습니다

기능 setPixelDataCGImageRef 이미지와 카피를 가져옵니다 그것을 pixelData. 그런 다음 (void) updateGraph 방법을 사용하여 CGImageRef pixelData을 사용하고 CFDataRef을 만들어 원시 픽셀 데이터를 얻습니다. 그러나 뭔가 잘못된 것이 있습니다. 왜냐하면 CFDataRef pixelRef을 입력으로 사용하여 CFDataGetLength 메서드를 사용할 때 프로그램을 실행할 때 EXC_BAD_ACCESS 오류가 발생하기 때문입니다. 저를 혼란스럽게하는 이유는 동일한 두 줄의 코드를 (void) setPixelData 함수에 넣고 코드를 updateGraph으로 주석 처리하면 프로그램이 완벽하게 잘 돌아갑니다.

이 오류의 원인과 해결 방법은 무엇입니까?

감사합니다,

+0

왜'CGImageGetData()'를 사용하지 않습니까? – nielsbot

답변

1

아 ... 나는

가했던 이유, 그것을 발견 나는이 setter 메소드 (그 중 하나는에 표시되지 않습니다했기 때문에없는 일이었다 암호). 항상 setPixelData 함수 전에 실행되었으므로 PixelData CGImageRef이 설정되지 않았으므로 CFDataRef이 존재하지 않아 메모리 오류가 발생합니다.