我有一个EAGLView(摘自Apple的示例),可以使用以下代码成功将其转换为UIImage:
- (UIImage *)glToUIImage:(CGSize)size {
NSInteger backingWidth = size.width;
NSInteger backingHeight = size.height;
NSInteger myDataLength = backingWidth * backingHeight * 4;
// allocate array and read pixels into it.
GLuint *buffer = (GLuint *) malloc(myDataLength);
glReadPixels(0, 0, backingWidth, backingHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders “upside down” so swap top to bottom into new array.
for(int y = 0; y < backingHeight / 2; y++) {
for(int x = 0; x < backingWidth; x++) {
//Swap top and bottom bytes
GLuint top = buffer[y * backingWidth + x];
GLuint bottom = buffer[(backingHeight - 1 - y) * backingWidth + x];
buffer[(backingHeight - 1 - y) * backingWidth + x] = top;
buffer[y * backingWidth + x] = bottom;
}
}
// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, releaseScreenshotData);
// prep the ingredients
const int bitsPerComponent = 8;
const int bitsPerPixel = 4 * bitsPerComponent;
const int bytesPerRow = 4 * backingWidth;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
// make the cgimage
CGImageRef imageRef = CGImageCreate(backingWidth, backingHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, YES, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
// then make the UIImage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return myImage;
}
void releaseScreenshotData(void *info, const void *data, size_t size) {
free((void *)data);
};
这是我使用此方法转换为UIImage的代码:
EAGLView *newView = [[EAGLView alloc] initWithImage:photo.originalImage];
[newView reshapeFramebuffer];
[newView drawView:theSlider.tag value:theSlider.value];
//the two lines above are how EAGLViews in Apple's examples are modified
photoItem *newPhoto = [[photoItem alloc] initWithImage:[self glToUIImage:photo.originalImage.size]];
我遇到的问题是,有时转换后的UIImage不会与EAGLView具有相同的颜色。如果将高饱和度应用于EAGLView,高亮度或低对比度等情况,就会发生这种情况。例如,如果我将高饱和度应用于EAGLView,然后转换为UIImage,则图像的某些部分将比其预期的要明亮。
因此,我发现问题是变相的EAGLView计时问题,类似于我在此之前的问题(EAGLView to UIImage timing question)。
最佳答案
对于仍在乎的人,请参阅以下我的评论:
汤米,我终于破解了自己的解决方案。这是另一个EAGLView计时问题(实际上仅在饱和状态下才出现),我可以使用performSelector:afterDelay:0.0方法解决此问题。谢谢
另外,我建议任何为iOS 5.0进行编码的人都可以研究Core Image和GLKView。它们基本上使您调整图像属性(如我在此处所做的工作)和将EAGLView转换为UIImage的工作变得简单得多。