Files
StickerSlack/StickerSlack/Emoji/GifManager.swift
neon443 c042e0a4bf asdf
2025-11-21 09:21:00 +00:00

42 lines
1.3 KiB
Swift

//
// GifManager.swift
// StickerSlack
//
// Created by neon443 on 19/11/2025.
//
import Foundation
import UIKit
class GifManager {
//from clock-run, 12 frames one second
static let defaultDuration: Double = 0.083333333333333329
static func gifFrom(url: URL) async -> [(frame: CGImage, showFor: Double)] {
guard let (data, _) = try? await URLSession.shared.data(from: url) else { return [] }
return gifFrom(data: data)
}
static func gifFrom(data: Data) -> [(frame: CGImage, showFor: Double)] {
guard let source = CGImageSourceCreateWithData(data as NSData, nil) else { fatalError("couldnt create source") }
let frameCount = CGImageSourceGetCount(source)
var result: [(frame: CGImage, showFor: Double)] = []
for i in 0..<frameCount {
guard let cgImage = CGImageSourceCreateImageAtIndex(source, i, nil) else {
print("AAAA")
continue
}
if let properties = CGImageSourceCopyPropertiesAtIndex(source, i, nil),
let gifInfo = (properties as NSDictionary)[kCGImagePropertyGIFDictionary as String] as? NSDictionary,
let frameDuration = (gifInfo[kCGImagePropertyGIFDelayTime as String] as? NSNumber) {
result.append((cgImage, frameDuration.doubleValue))
} else {
result.append((cgImage, defaultDuration))
}
}
return result
}
}