2012-12-17 40 views
0

我想从我的iOS应用程序中的png图像资源中读取ARGB像素数据。 我使用CGDataProvider获得CFDataRef如下所述: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; 
} 

这就是所谓的一个CGImageRef第二次是从[UIImage的imageNamed:路径]起源与相同的路径,我第一次得到长度为0 的dataRef它虽然工作在第一时间。

+0

一些代码将非常有帮助。 – trudyscousin

+0

相关:http://stackoverflow.com/questions/12363801/ios-cgimagecreatewithpng-or-jpegdataprovider-causes-segmentation-fault – 2012-12-17 21:12:24

+0

@ H2CO3:这似乎是关于创建一个数据提供商,然后从它创建一个图像,而不是创建一个图像并获取其数据提供者。或者我错过了什么? –

回答

1

我发现了一个与我发布并修复它的代码有关的大问题。 首先,即使我没有两次加载相同的图像,但更多的图像,我仍然崩溃。由于这个问题与记忆有关,它以各种奇怪的方式失败。

与代码的问题是,我打电话:“CGDataProviderRelease(dataProvider);” 我正在使用newImageSource的数据提供者,但我没有创建此数据提供者。这就是为什么我不应该发布它。 只有创建,保留或复制它们时,才需要释放它们。

除此之外,由于内存不足导致我的应用程序崩溃,但修复此问题后,我能够使用“经济”类型,尽快分配和释放。

目前我看不出这个特定的代码有什么问题。

相关问题