我正在尝试从我的 ios 应用程序中的 png 图像资源读取 ARGB 像素数据。 我正在使用 CGDataProvider 来获取 CFDataRef,如下所述:
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;
}
第二次在源自 [UIimage imageNamed: Path] 且路径与第一次相同的 CGImageRef 上调用此方法时,我得到长度为 0 的 dataRef。 不过第一次就可以了。
最佳答案
我发现我发布的代码存在一个大问题并修复了它。 首先,即使我没有加载相同的图像两次,而是加载更多的图像,我也会崩溃。由于该问题与内存有关,因此它以各种奇怪的方式失败。
代码的问题是我正在调用:“CGDataProviderRelease(dataProvider);” 我正在使用newImageSource的数据提供程序,但我没有创建这个数据提供程序。这就是为什么我不应该释放它。 仅当您创建、保留或复制事物时,您才需要释放它们。
除此之外,我的应用程序有时会因内存不足而崩溃,但修复此问题后,我能够使用“经济”类型,尽快分配和释放。
目前我看不出这段特定代码有任何其他问题。
关于objective-c - CGDataProvider 第一次工作,第二次返回空图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13922233/