我正在开发一款使用GPUimage将效果应用于实时视频的应用。
其中一个效果需要将图像作为纹理加载,然后在视频中过度显示该图像。
所有图片都是PNG文件。 used可以从列表中选择一个图像。
我使用以下代码加载纹理,它在98%的时间内工作,但随机纹理不加载,我只是得到一个黑色方块。如果纹理无法加载,我尝试使用相同的图像重新加载它,它的工作原理。再次加载失败是非常随机的。
任何想法/建议都将不胜感激。
-(GLuint) loadTexture:(NSString *)fileName
{
NSString *filePath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],fileName];
UIImage *image = [UIImage imageWithContentsOfFile:filePath];
GLuint width = image.size.width;
GLuint height = image.size.height;
if(width == 0 ){
width = 64;
}
if(height == 0 )
{
height = 64;
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
size_t cwidth = ceil( width );
size_t cheight = ceil( height );
size_t bytesPerRow = ( 4*cwidth + 15 ) & ~15;
void *imageData = calloc( bytesPerRow, cheight );
NSLog(@"texture : WIDTH %d HEIGHT %d\n", width, height);
CGContextRef context = CGBitmapContextCreate( imageData, cwidth, cheight, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big );
CGColorSpaceRelease( colorSpace );
CGContextClearRect( context, CGRectMake( 0, 0, cwidth, cheight ) );
CGRect bounds=CGRectMake( 0, 0, cwidth, cheight );
CGContextScaleCTM(context, 1, -1);
bounds.size.height = bounds.size.height*-1;
CGContextDrawImage(context, bounds, image.CGImage);
GLuint lTextId;
glGenTextures(1, &lTextId);
glBindTexture(GL_TEXTURE_2D, lTextId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)cwidth, (GLsizei)cheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
CGContextRelease(context);
free(imageData);
return( lTextId);
}
答案 0 :(得分:0)
我不确定它会有所帮助,但我强烈建议你改变
NSString *filePath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],fileName];
到
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];