You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS Swift中转换PNG格式适配OpenAI图片编辑API

iOS Swift 转换PNG图片至RGBA/LA/L格式适配OpenAI API

针对OpenAI Create Image Edit API要求掩码图片必须为RGBA/LA/L格式的问题,以下是Swift下的具体实现代码:

核心转换方法

转换为RGBA格式(优先推荐)

RGBA是带Alpha通道的通用格式,适配性最强:

import UIKit

func convertImageToRGBA(_ image: UIImage) -> UIImage? {
    guard let cgImage = image.cgImage else { return nil }
    
    // 创建RGBA颜色空间
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue
    
    // 创建绘图上下文
    guard let context = CGContext(data: nil,
                                  width: cgImage.width,
                                  height: cgImage.height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: cgImage.width * 4,
                                  space: colorSpace,
                                  bitmapInfo: bitmapInfo) else { return nil }
    
    // 绘制原图到上下文
    context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height))
    
    // 生成转换后的图片
    guard let newCGImage = context.makeImage() else { return nil }
    return UIImage(cgImage: newCGImage)
}

转换为LA格式(灰度带Alpha通道)

适合需要灰度+透明效果的场景:

func convertImageToLA(_ image: UIImage) -> UIImage? {
    guard let cgImage = image.cgImage else { return nil }
    
    // 创建灰度颜色空间
    let colorSpace = CGColorSpaceCreateDeviceGray()
    let bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValue | CGImageAlphaInfo.alphaOnly.rawValue
    
    guard let context = CGContext(data: nil,
                                  width: cgImage.width,
                                  height: cgImage.height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: cgImage.width * 2,
                                  space: colorSpace,
                                  bitmapInfo: bitmapInfo) else { return nil }
    
    context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height))
    
    guard let newCGImage = context.makeImage() else { return nil }
    return UIImage(cgImage: newCGImage)
}

转换为L格式(纯灰度无Alpha)

仅需纯灰度掩码时使用:

func convertImageToL(_ image: UIImage) -> UIImage? {
    guard let cgImage = image.cgImage else { return nil }
    
    let colorSpace = CGColorSpaceCreateDeviceGray()
    let bitmapInfo = CGImageAlphaInfo.none.rawValue
    
    guard let context = CGContext(data: nil,
                                  width: cgImage.width,
                                  height: cgImage.height,
                                  bitsPerComponent: 8,
                                  bytesPerRow: cgImage.width,
                                  space: colorSpace,
                                  bitmapInfo: bitmapInfo) else { return nil }
    
    context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height))
    
    guard let newCGImage = context.makeImage() else { return nil }
    return UIImage(cgImage: newCGImage)
}

使用示例

将本地掩码图片转换后用于API请求:

// 加载本地maskImage.png
guard let originalImage = UIImage(named: "maskImage") else {
    print("无法加载图片")
    return
}

// 转换为RGBA格式
guard let rgbaImage = convertImageToRGBA(originalImage) else {
    print("格式转换失败")
    return
}

// 转为PNG数据用于API上传
if let pngData = rgbaImage.pngData() {
    // 此处将pngData传入OpenAI API请求体
}

注意:转换后的图片需保持与原图尺寸完全一致,否则可能导致API处理异常。

内容的提问来源于stack exchange,提问作者Symon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:15:11