首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EAGLView到UIImage的颜色转换问题

EAGLView到UIImage的颜色转换问题
EN

Stack Overflow用户
提问于 2011-08-17 07:46:39
回答 1查看 824关注 0票数 12

我有一个EAGLView (取自苹果的例子),我可以用下面的代码成功地将它转换成UIImage:

代码语言:javascript
复制
- (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的代码:

代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-04 12:20:56

如果任何人仍然关心,请看我下面的评论:

汤米我终于破解出了一个解决方案。这是另一个EAGLView计时问题(实际上只在饱和时出现),我能够用你的performSelector:afterDelay:0.0方法解决它。Thx

此外,我建议任何为iOS 5.0编写代码的人都可以研究一下核心图像和GLKView。它们基本上使您的工作,调整图像属性(就像我在这里做的那样)和EAGLView到UIImage转换类型的东西变得更简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7086468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档