我需要阅读CAEAGLLayer的内容,它具有各种宽度和高度(基于背景图像大小)。在iPad模拟器上一切都很好,但在设备上我崩溃或奇怪的水平线而不是内容。 崩溃不会发生在宽度上,例如,从537到544像素
我正在使用以下代码
- (UIImage*)image
{
// Get the size of the backing CAEAGLLayer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
NSInteger x = 0, y = 0, width = backingWidth, height = backingHeight;
NSInteger dataLength = width * height * 4;
GLubyte *data = (GLubyte*)malloc(dataLength * sizeof(GLubyte));
// Read pixel data from the framebuffer
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);
// Create a CGImage with the pixel data
// If your OpenGL ES content is opaque, use kCGImageAlphaNoneSkipLast to ignore the alpha channel
// otherwise, use kCGImageAlphaPremultipliedLast
CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, data, dataLength, NULL);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGImageRef iref = CGImageCreate(width, height, 8, 32, width * 4, colorspace, kCGBitmapByteOrder32Big | kCGImageAlphaPremultipliedLast,
ref, NULL, true, kCGRenderingIntentDefault);
// OpenGL ES measures data in PIXELS
// Create a graphics context with the target size measured in POINTS
NSInteger widthInPoints, heightInPoints;
// if (NULL != UIGraphicsBeginImageContextWithOptions) {
// // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
// // Set the scale parameter to your OpenGL ES view's contentScaleFactor
// // so that you get a high-resolution snapshot when its value is greater than 1.0
// CGFloat scale = eaglview.contentScaleFactor;
// widthInPoints = width / scale;
// heightInPoints = height / scale;
// UIGraphicsBeginImageContextWithOptions(CGSizeMake( widthInPoints, heightInPoints), NO, scale);
// }
// else {
// On iOS prior to 4, fall back to use UIGraphicsBeginImageContext
widthInPoints = width;
heightInPoints = height;
UIGraphicsBeginImageContext(CGSizeMake(widthInPoints, heightInPoints));
// }
CGContextRef cgcontext = UIGraphicsGetCurrentContext();
// UIKit coordinate system is upside down to GL/Quartz coordinate system
// Flip the CGImage by rendering it to the flipped bitmap context
// The size of the destination area is measured in POINTS
CGContextSetBlendMode(cgcontext, kCGBlendModeCopy);
CGContextDrawImage(cgcontext, CGRectMake(0.0, 0.0, widthInPoints, heightInPoints), iref);
// Retrieve the UIImage from the current context
UIImage *image1 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Clean up
free(data);
CFRelease(ref);
CFRelease(colorspace);
CGImageRelease(iref);
return image1;
}
答案 0 :(得分:4)
您正在阅读的视图或您的可绘制区域必须是32的倍数(可能是16,但我还没有测试过)。也许您可以尝试将绘制区域的大小调整为32的倍数?我之前遇到了水平线问题并调整了我从400x300到384x288读取的部分。
答案 1 :(得分:0)
在我的情况下,任何宽度乘以4!