iOS7如何拍摄OpenGLES截图。

时间:2014-05-22 22:03:31

标签: ios objective-c opengl-es opengl-es-2.0

我正在使用VLCKit在我的应用中播放视频,我需要能够在某些点拍摄视频的屏幕截图。这是我使用的代码:

-(NSData*)generateThumbnail{


    int s = 1;
    UIScreen* screen = [UIScreen mainScreen];
    if ([screen respondsToSelector:@selector(scale)]) {
        s = (int) [screen scale];
    }

    GLint viewport[4];
    glGetIntegerv(GL_VIEWPORT, viewport);


    int width = viewport[2];
    int height = [_profile.resolution integerValue];//viewport[3];

    int myDataLength = width * height * 4;
    GLubyte *buffer = (GLubyte *) malloc(myDataLength);
    GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
    for(int y1 = 0; y1 < height; y1++) {
        for(int x1 = 0; x1 <width * 4; x1++) {
            buffer2[(height - 1 - y1) * width * 4 + x1] = buffer[y1 * 4 * width + x1];
        }
    }
    free(buffer);

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);
    int bitsPerComponent = 8;
    int bitsPerPixel = 32;
    int bytesPerRow = 4 * width;
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    CGImageRef imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);
    UIImage *image = [ UIImage imageWithCGImage:imageRef scale:s orientation:UIImageOrientationUp ];
     NSData *thumbAsData = UIImageJPEGRepresentation(image, 5);
    return thumbAsData;

}

说实话,我不知道大部分是如何运作的。我刚刚从某个地方复制过它(我不记得来源)。它主要是工作,但是经常看起来图像的某些部分缺失。

screenshot screenshot

有人能指出我正确的方向吗?我看到的关于OpenGL截图的大多数其他帖子都相当陈旧,似乎并不适用。

感谢。

2 个答案:

答案 0 :(得分:0)

我写了一个类来解决这个问题。

基本上你直接从屏幕上截取屏幕截图,然后如果你愿意,你可以只拍摄部分图片并进行缩放。

从屏幕截取屏幕截图,您可以获取所有内容。 UIKit,OpenGL,AVFoundation等。

这里是班级:https://github.com/matteogobbi/MGScreenshotHelper/

下面是有用的功能,但我建议你直接下载(和明星:D)我的助手类;)

/* Get the screenshot of the screen (useful when you have UIKit elements and OpenGL or AVFoundation stuff */
+ (UIImage *)screenshotFromScreen
{
    CGImageRef UIGetScreenImage(void);
    CGImageRef screen = UIGetScreenImage();
    UIImage* screenImage = [UIImage imageWithCGImage:screen];
    CGImageRelease(screen);

    return screenImage;
}

/* Get the screenshot of a determinate rect of the screen, and scale it to the size that you want. */
+ (UIImage *)getScreenshotFromScreenWithRect:(CGRect)captureRect andScaleToSize:(CGSize)newSize
{
    UIImage *image = [[self class] screenshotFromScreen];
    image = [[self class] cropImage:image withRect:captureRect];
    image = [[self class] scaleImage:image toSize:newSize];

    return image;
}


#pragma mark - Other methods

/* Get a portion of an image */
+ (UIImage *)cropImage:(UIImage *)image withRect:(CGRect)rect
{
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *cropedImage = [UIImage imageWithCGImage:imageRef];

    return cropedImage;
}

/* Scale an image */
+ (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)newSize
{
    UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return scaledImage;
}

答案 1 :(得分:0)

好的结果证明这只是模拟器中的一个问题。在设备上,它似乎在98%的时间内工作。