2012-12-17 4 views
0

내 ios 앱의 png 이미지 애셋에서 ARGB 픽셀 데이터를 읽으려고합니다. 여기에 설명 된 바와 같이 나는 CFDataRef를 얻을 수 CGDataProvider을 사용하고 있습니다 : 그것은 완벽하게 내가 어떤 이미지를 처음 사용할 때 작동CGDataProvider가 처음으로 작동하고 두 번째로 빈 이미지를 반환합니다.

http://developer.apple.com/library/ios/#qa/qa1509/_index.html

. 하지만 두 번째로 동일한 이미지에서 사용하면 길이 0 CFDataRef를 반환합니다.

아마도 내가 뭔가를 공개하지 않습니까? 왜 그렇게했을까요?

- (GLuint)initWithCGImage:(CGImageRef)newImageSource 
{ 
    CGDataProviderRef dataProvider; 
    CFDataRef dataRef; 

    GLuint t; 

    @try { 
// NSLog(@"initWithCGImage"); 
// report_memory2(); 
    CGFloat widthOfImage = CGImageGetWidth(newImageSource); 
    CGFloat heightOfImage = CGImageGetHeight(newImageSource); 
    // pixelSizeOfImage = CGSizeMake(widthOfImage, heightOfImage); 
    // CGSize pixelSizeToUseForTexture = pixelSizeOfImage; 

    // CGSize scaledImageSizeToFitOnGPU = [GPUImageOpenGLESContext sizeThatFitsWithinATextureForSize:pixelSizeOfImage]; 

    GLubyte *imageData = NULL; 
    //CFDataRef dataFromImageDataProvider; 


    // stbi stbiClass; 
    int x; 
    int y; 
    int comp; 

    dataProvider = CGImageGetDataProvider(newImageSource); 
    dataRef = CGDataProviderCopyData(dataProvider); 

    const unsigned char * bytesRef = CFDataGetBytePtr(dataRef); 
    // NSUInteger length = CFDataGetLength(dataRef); 

    //CGDataProviderRelease(dataProvider); 
    //dataProvider = nil; 
    /* 
    UIImage *tmpImage = [UIImage imageWithCGImage:newImageSource]; 

    NSData *data2 =   UIImagePNGRepresentation(tmpImage); 
// if (data2==NULL) 
//  data2 =  UIImageJPEGRepresentation(tmpImage, 1); 

    unsigned char *bytes = (unsigned char *)[data2 bytes]; 
    NSUInteger length = [data2 length];*/ 
// stbiClass.img_buffer = bytes; 
// stbiClass.buflen = length; 
// stbiClass.img_buffer_original = bytes; 
// stbiClass.img_buffer_end = bytes + length; 

// unsigned char *data = stbi_load_main(&stbiClass, &x, &y, &comp, 0); 
    //unsigned char * data = bytesRef; 
    x = widthOfImage; 
    y = heightOfImage; 
    comp = CGImageGetBitsPerPixel(newImageSource)/8; 

    int textureWidth = [self CalcPow2: x]; 
    int textureHeight = [self CalcPow2: y]; 

    unsigned char *scaledData = [self scaleImageWithParams:@{@"x":@(x), @"y":@(y), @"comp":@(comp), @"targetX":@(textureWidth), @"targetY":@(textureHeight)} andData:(unsigned char *)bytesRef]; 
    //CFRelease (dataRef); 
    // dataRef = nil; 
// free (data); 

    glGenTextures(1, &t); 

    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, t); 
    GLint format = (comp > 3) ? GL_RGBA : GL_RGB; 


    imageData = scaledData; 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexImage2D(GL_TEXTURE_2D, 0, format, textureWidth, textureHeight, 0, format, GL_UNSIGNED_BYTE, imageData); 
    //GLenum err = glGetError(); 
    } 
    @finally 
    { 
     CGDataProviderRelease(dataProvider); 
//  CGColorSpaceRelease(colorSpaceRef); 
     CGImageRelease(dataRef); 
    } 


    return t; 
} 

A [있는 UIImage imageNamed : 경로]에서 발생한 이것은 CGImageRef에 호출되는 두 번째로 처음과 같은 경로로, 나는 그것은 비록 처음 작동 길이 0 의 dataRef를 얻을 수 .

+0

일부 코드는 도움이 될 것입니다. – trudyscousin

+0

관련 항목 : http://stackoverflow.com/questions/12363801/ios-cgimagecreatewithpng-jpegdataprovider-causes-segmentation-fault –

+0

@ H2CO3 : 데이터 제공 업체를 만든 다음이 회사에서 이미지를 만드는 방법 인 것 같습니다. 이미지를 만들고 데이터 공급자를 얻는 것입니다. 또는 나는 무엇인가 놓치고 있냐? –

답변

1

내가 게시 및 수정 한 코드에서 하나의 큰 문제점을 발견했습니다. 우선 동일한 이미지를 두 번로드하지 않고 오히려 더 많은 이미지를로드하더라도 충돌이 발생했습니다. 문제는 메모리와 관련이 있기 때문에 모든 종류의 이상한 방식으로 실패했습니다.

코드 문제는 내가 "CGDataProviderRelease (dataProvider);"라고합니다. newImageSource의 데이터 공급자를 사용하고 있지만이 dataprovider를 만들지 않았습니다. 그래서 내가 그것을 풀어서는 안된다. 물건을 생성, 보관 또는 복사 한 경우에만 물건을 해제해야합니다.

메모리 부족으로 인해 내 앱이 비정상적으로 종료되는 것을 제외하고는이 문제를 해결 한 후 최대한 빨리 할당하고 풀어주는 "절약형"유형을 사용할 수있었습니다.

현재이 특정 코드에 문제가있는 것은 아닙니다.