SDL在iOS上保存截图

5

我正在尝试从SDL的“窗口”保存屏幕或帧到PNG文件中,因此我正在使用SDL_image库。我的代码如下所示:

IMG_Init(Int32(IMG_INIT_PNG.rawValue))
let screenShot = SDL_CreateRGBSurface(0, 640, 480, 32, 0, 0, 0, 0)
SDL_SetRenderTarget(renderer, texture)
SDL_RenderReadPixels(renderer, nil, Uint32(SDL_PIXELFORMAT_ARGB8888), screenShot?.pointee.pixels, (screenShot?.pointee.pitch)!)
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
IMG_SavePNG(screenShot, "\(documentsPath)/image.png")
SDL_FreeSurface(screenShot)

但是image.png没有保存。如果有人能够引导或帮助我,谢谢!

另外的代码,保存的图像只是黑色。

IMG_Init(Int32(IMG_INIT_PNG.rawValue))
let screenShot = SDL_CreateRGBSurface(Uint32(SDL_SWSURFACE), 640, 480, 32, 0, 0, 0, 0)
// SDL_SetRenderTarget(renderer, texture)
SDL_RenderReadPixels(renderer, nil, Uint32(SDL_PIXELFORMAT_ARGB8888), screenShot?.pointee.pixels, (screenShot?.pointee.pitch)!)
// Save to documents directory
let fileManager = FileManager.default
do {
    let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    let fileUrl = documentDirectory.appendingPathComponent("imageLOL.png")
    if !fileManager.fileExists(atPath: fileUrl.path) {
        print("File NO exists")
        // Create file at path
        let data = Data()
        let createFile = fileManager.createFile(atPath: fileUrl.path, contents: data, attributes: nil)
        if createFile {
            print("Create file success")
        } else {
            print("Create file failed")
        }
    } else {
        print("File exists")

    }
    let result = IMG_SavePNG(screenShot, fileUrl.path)
    print("result = \(result)")
    // After saving screenshot
    let image = UIImage(contentsOfFile: fileUrl.path)
    let imageData = UIImagePNGRepresentation(image!)
    print("image length = \(String(describing: imageData?.count))")
    UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)
    SDL_FreeSurface(screenShot)
} catch {
    print("Error docs = \(error)")
}

你确定你的路径正确吗?你能用这个路径保存任何文件吗?在保存失败后,SDL_GetError() 返回什么? - keltar
根据文档,您也可以将文件保存为“image.png”,而无需指定文件路径。但是我似乎找不到这个图像。它应该被保存在哪里? - Lawrence Gimenez
请看一下我对此的回答。 - Abhishek
如果您觉得我的回答有用,请至少点赞或接受我的答案。 - Abhishek
你尝试过将0传递到SDL_RenderReadPixels的像素格式参数中吗?文档说这将使其使用与渲染目标相同的格式,这可能是导致所有黑色像素的问题所在。 - NSGangster
显示剩余12条评论
2个回答

2

我能够从SDL_window中保存截图。首先,我创建了一个PNG格式的文件,如下所示:

let image = UIImage()
let data = UIImagePNGRepresentation(image)
try data?.write(to: fileUrl)

然后您调用IMG_SavePNG()方法。

@abhishek 是的,我已经这样做了,问题是在IMG_SavePNG保存图像之前,我需要创建一个目录和文件。 - Lawrence Gimenez

2

在截屏时,如果您正在播放视频,则无法在截图中获取视频帧,只会得到黑色屏幕图像。

请尝试对任何应用程序的屏幕进行截图,看看是否有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接