Files
MLXServer/MLXServer/Server/ImageDecoder.swift

31 lines
1.0 KiB
Swift

import AppKit
import CoreImage
import Foundation
import MLXLMCommon
/// Extracted from APIServer decodes data URIs to UserInput.Image.
enum ImageDecoder {
struct DecodedImage {
let image: UserInput.Image
let estimatedBytes: Int
}
static func decode(_ urlString: String) -> DecodedImage? {
let base64String: String
if urlString.hasPrefix("data:") {
guard let commaIndex = urlString.firstIndex(of: ",") else { return nil }
base64String = String(urlString[urlString.index(after: commaIndex)...])
} else {
base64String = urlString
}
guard let data = Data(base64Encoded: base64String),
let nsImage = NSImage(data: data),
let cgImage = nsImage.cgImage(forProposedRect: nil, context: nil, hints: nil) else {
return nil
}
let estimatedBytes = max(data.count, cgImage.width * cgImage.height * 4)
return DecodedImage(image: .ciImage(CIImage(cgImage: cgImage)), estimatedBytes: estimatedBytes)
}
}