我知道你已经实现了通道调用,直到将字节和平面转换为 UIImage。但我注意到在以下方面没有做太多工作:
在 Swift 中通过 Flutter Image Stream 重新生成图像。
因此,如果有人遇到相同的问题,我将在 SWIFT End 添加所有步骤。
第 1 步:
在 Swift 中通过 Channle 调用接收参数
guard let args = call.arguments else {
result("iOS could not recognize flutter arguments in method: (yourFuncName)")
return
}
第 2 步:从字典中提取 4 图像所需的重要值
再生。
let params: [String : Any] = args as! [String : Any]
let imageData: [String : Any] = params["imageData"] as! [String : Any]
第 3 步:将 imageData 作为 NSDictionary 传递给 UIImageFromImageData
guard let image = UIImageFromImageData(imageData: imageData as NSDictionary ) else { return }
UIImageFromImageData:
func UIImageFromImageData(imageData: NSDictionary) -> UIImage? {
if(imageData.count > 0)
{
return bytesToImage(imageData: imageData)!;
}else
{
return nil
}
}
bytesToImage
func bytesToImage(imageData: [String : Any]) -> UIImage?{
let imgD: FlutterStandardTypedData? = imageData["bytes"] as? FlutterStandardTypedData
let imageBytes : Data
imageBytes = imgD!.data
let metadata: [String : Any] = imageData["metadata"] as! [String : Any]
let planeData = metadata["planeData"] as! Array<Any>
let planeCount = planeData.count
let width = metadata["width"] as! Int
let height = metadata["height"] as! Int
let rawFormat = metadata["imageFormat"] as! NSNumber
let pxBuffer: CVPixelBuffer?;
if(planeCount==0)
{
//Throw Exception planes should be greated than Zero
return nil
}
else if (planeCount==1)
{
let plane: [String : Any] = planeData[0] as! [String : Any]
let bytesPerRow = plane["bytesPerRow"] as! Int
let bytesData : UnsafeMutableRawBufferPointer
let nsData = imageBytes as NSData
let rawPtr = nsData.bytes
let b:UnsafeMutableRawPointer = UnsafeMutableRawPointer(mutating:rawPtr)
pxBuffer = bytesToPixelBuffer(width: width, height: height, format: rawFormat, baseAddress: b, bytesPerRow: bytesPerRow)
if pxBuffer != nil {
return UIImage(cgImage: pxBufferToCGImage(pixelBuffer: pxBuffer!)!)
}
else
{
return
}
}
else
{
pxBuffer = planarBytesToPixelBuffer()
}
return UIImage()
}
bytesToPixelBuffer
func bytesToPixelBuffer(width: Int, height: Int, format: FourCharCode,baseAddress : UnsafeMutableRawPointer, bytesPerRow: Int) -> CVBuffer?{
var dstPixelBuffer: CVBuffer?
// Format is very Important use Same Format to regenerate buffer as you were using in Flutter Side I would recommend 1111970369 Raw format.
CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, format, baseAddress, bytesPerRow,
nil, nil, nil, &dstPixelBuffer)
return dstPixelBuffer ?? nil
}