加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – 为什么这个GLView截图代码返回空白/黑色UIImage?

发布时间:2020-12-14 19:06:56 所属栏目:百科 来源:网络整理
导读:我使用以下代码截取GLView中的像素截图.问题是,它返回一个完全黑色的UI Image.这个代码是在LineDrawer.m中调用的,它是GLView代码的核心 – 所以它是从右边的.m文件中调用的.如何保存实际屏幕截图而不是黑色图像? - (UIImage*) getGLScreenshot {NSLog(@"1")
我使用以下代码截取GLView中的像素截图.问题是,它返回一个完全黑色的UI Image.这个代码是在LineDrawer.m中调用的,它是GLView代码的核心 – 所以它是从右边的.m文件中调用的.如何保存实际屏幕截图而不是黑色图像?

- (UIImage*) getGLScreenshot {

NSLog(@"1");

float scale = 0.0;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
{
    // scale value should be 1.0 on 3G and 3GS,and 2.0 on iPhone 4.
    scale = [[UIScreen mainScreen] scale]; 
}

// these are swapped since the screen is rotatey
float h = 768 * scale;
float w = 924 * scale;

NSInteger myDataLength = w * h * 4;

// allocate array and read pixels into it.
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
glReadPixels(0,w,h,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 <h; y++)
{
    for(int x = 0; x <w * 4; x++)
    {
        buffer2[(((int)h-1) - y) * (int)w * 4 + x] = buffer[y * 4 * (int)w + 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 * w;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

// make the cgimage
CGImageRef imageRef = CGImageCreate(w,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);

// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
return myImage;

}

- (void)saveGLScreenshotToPhotosAlbum {
UIImageWriteToSavedPhotosAlbum([self getGLScreenshot],nil,nil);
}

解决方法

我不得不在麻雀框架中做类似的事情,不久之前,你应该能够从这个论坛回复的代码中提取你需要的部分:
http://forum.sparrow-framework.org/topic/spdisplayobjectscreenshot

编辑:也是这篇文章http://forum.sparrow-framework.org/topic/taking-screenshots

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读