Swift中裁剪UInt8数组格式图片失败,求排查解决思路
UInt8数组图片裁剪函数失效问题排查
我尝试对UInt8数组格式的图片进行裁剪,编写了如下cropImageArray函数:
func cropImageArray(byteArray: [UInt8], sourceWidth: Int32, bitsPerPixel: Int32, rect: Int32Rect) -> [UInt8] { var blockSize = bitsPerPixel / 8 var outputPixels = [UInt8]() for _ in 0..<(rect.width * rect.height * blockSize) { outputPixels.append(UInt8(0.0)) } for line in Int32(0) ..< rect.height { var sourceIndex = (((rect.y + line) * sourceWidth) + rect.x) * blockSize var destinationIndex = (line * rect.width) * blockSize for i in Int32(0) ..< Int32(rect.width * blockSize) { outputPixels[Int(destinationIndex + i)] = byteArray[Int(sourceIndex + i)] } } return outputPixels }
但该函数无法正常工作,生成的图片损坏。请问可能的问题是什么?
补充说明:字节数组的获取方式
let img: UIImage! = UIImage(named: "example") let d: Data! = img.pngData() let ptr = UnsafeMutablePointer<UInt8>.allocate(capacity: d.count) d.withUnsafeBytes { (buff) -> Void in ptr.initialize(from: buff.bindMemory(to: UInt8.self).baseAddress!, count: d.count) } let byteArray = UnsafeMutableBufferPointer(start: ptr, count: d.count).map({$0})
补充说明2
由于性能需求,最终采用了基于CVPixelBuffer的图片处理方案。
可能的问题原因
- PNG数据并非原始像素数组:
pngData()返回的是经过压缩编码的PNG格式文件数据,包含文件头、压缩块等结构,并非可直接操作的原始像素(如RGBA)字节流。你的裁剪函数假设输入是逐像素排列的原始数据,直接处理PNG压缩数据必然导致图片格式损坏。 - 内存操作不规范:手动分配的
UnsafeMutablePointer未释放,会引发内存泄漏,但这不是图片损坏的直接原因。核心问题还是数据格式不匹配。 - 未考虑像素行对齐:即使是原始像素数据,部分图像格式(如BGRA)会对每行的字节数做对齐处理(比如对齐到4字节的倍数),你的函数直接按
sourceWidth * blockSize计算行偏移,忽略对齐的话会导致像素读取错位,出现画面混乱、条纹等问题。
内容的提问来源于stack exchange,提问作者fuhr
相关产品推荐
相关产品推荐

