【问题标题】:Taking snapshot of AGSMapView拍摄 AGSMapView 的快照
【发布时间】:2016-06-10 07:27:21
【问题描述】:

使用以下代码拍摄 AGSMapView 的快照

此代码将设置 kEAGLDrawablePropertyRetainedBacking 属性,否则它将拍摄白色快照。

let layer =  self.AgsMapView.layer as! CAEAGLLayer
        layer.drawableProperties = [
            kEAGLDrawablePropertyRetainedBacking: NSNumber(int: 1),                                      kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8]

拍摄快照的代码

func snapshotForEAGLView() -> UIImage {

        //glFlush()
        var width: GLint = 0, height: GLint = 0
        let scale: CGFloat = UIScreen.mainScreen().scale
        let prevGLContext = EAGLContext.currentContext()
glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_WIDTH), &width)
        glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_HEIGHT), &height)

        let dataLength = width * height * 4
        let imageBytes = UnsafeMutablePointer<GLubyte>.alloc(Int(dataLength))

        glPixelStorei(GLenum(GL_PACK_ALIGNMENT), 4)

        glReadPixels(0, 0, GLsizei(width), GLsizei(height), GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), imageBytes)

        let dataProvider = CGDataProviderCreateWithData(nil, imageBytes, Int(dataLength), nil)

        EAGLContext.setCurrentContext(prevGLContext)

        let colorSpace = CGColorSpaceCreateDeviceRGB()
        if let imageRef = CGImageCreate(Int(width), Int(height), 8, 32, Int(width) * 4, colorSpace, [CGBitmapInfo.ByteOrder32Big, CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)], dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault) {
            return UIImage(CGImage: imageRef, scale: scale, orientation: .DownMirrored)
        }
        return UIImage()
    }

在应用程序中,我们在两个控制器上有AGSMapView,比如说Controller1 和Controller2,点击Controller1 上的按钮,按下Controller2。

我们正在对Controller2进行截图,但有时它会从Controller1截取AGSMapView的截图

它是随机发生的,我们有什么方法可以提供截屏的视图或任何其他方式来避免这种情况。

非常感谢任何帮助。

【问题讨论】:

    标签: ios objective-c swift arcgis


    【解决方案1】:

    drawViewHierarchyInRect

    辛苦了,谢谢大家

        let size = CGSizeMake(viewWidth, viewHeight)
    
        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.mainScreen().scale)
    
        let rec = CGRectMake(0, 0, viewWidth, viewHeight)
        self.agsMapView.drawViewHierarchyInRect(rec, afterScreenUpdates: true)
    
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2018-12-03
      • 1970-01-01
      • 2015-02-13
      • 2017-10-05
      相关资源
      最近更新 更多