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
相关产品推荐
相关产品推荐

