IOS 截图(opengl)

最近做视频截图,用普通的截图的方法,无法截取视频的图像,地图也是无法截图的

用opengl的方法来截图,前提是你的视频流必须在这上面渲染了

步骤:

1:你的视图初始化的时候,必须转换一下,而且要声明可以进行绘图

 CAEAGLLayer *eaglLayer = (CAEAGLLayer *) self.layer;

        eaglLayer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking: [NSNumber numberWithBool:YES], kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8

                                          };

而后就设置opengl的一些参数,这里不在叙述

2:截图的代码

-(UIImage *)glToUIImage {

     CGSize viewSize=self.frame.size;

     NSInteger myDataLength = viewSize.width * viewSize.height * 4; // allocate array and read pixels into it.

     GLubyte *buffer = (GLubyte *) malloc(myDataLength);

     glReadPixels(0, 0, viewSize.width, viewSize.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); // gl renders "upside down" so swap top to bottom into new array. // there's gotta be a better way, but this works.

     GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);

     for(int y = 0; y < viewSize.height; y++) {

         for(int x = 0; x < viewSize.width* 4; x++) {

             buffer2[(int)((viewSize.height-1 - y) * viewSize.width * 4 + x)] = buffer[(int)(y * 4 * viewSize.width + x)];

         }

     }

     // make data provider with data.

     CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL);

     // prep the ingredients

     int bitsPerComponent = 8;

     int bitsPerPixel = 32;

     int bytesPerRow = 4 * viewSize.width;

     CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

     CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;

     CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

     // make the cgimage

     CGImageRef imageRef = CGImageCreate(viewSize.width , viewSize.height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

     // then make the uiimage from that

     UIImage *myImage = [UIImage imageWithCGImage:imageRef];

     free(buffer);

     CFRelease(provider);

     CFRelease(colorSpaceRef);

     CGImageRelease(imageRef);

     

     return myImage;

 }




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值