这是this thread的延续。我的第一个问题得到了回答,所以我认为继续评论和扩展问题是不礼貌的。
使用下面的代码,我将RGBA图像转换为整数数组。但是,当我转换回图像时,数据很奇怪。 我的反向转换过程不是问题,因为当我在创建时调试像素数组时,像素与原始图像不匹配:它们与失真的像素匹配。
我想知道这些问题可能是什么来源。
代码:
init?(fromImage image: UIImage!) {
let imageRef = image!.CGImage
self.width = CGImageGetWidth(imageRef)
self.height = CGImageGetHeight(imageRef)
let colorspace = CGColorSpaceCreateDeviceRGB()
let bytesPerRow = (4 * width);
let bitsPerComponent :UInt = 8
let pixels = UnsafeMutablePointer<UInt8>(malloc(width*height*4))
var context = CGBitmapContextCreate(pixels, width, height, Int(bitsPerComponent), bytesPerRow, colorspace, CGImageAlphaInfo.PremultipliedLast.rawValue);
CGContextDrawImage(context, CGRectMake(0, 0, CGFloat(width), CGFloat(height)), imageRef)
for row in 0 ..< height {
for col in 0 ..< width {
let offset = 4 * (width * row) + col
print("\(pixels[offset]) ", terminator:"")
print("\(pixels[offset + 1]) ", terminator:"")
print("\(pixels[offset + 2]) ", terminator:"")
print("\(pixels[offset + 3]) ", terminator:"")
print(" | ", terminator:"")
}
print(" ")
}
}
一切都有帮助!再次感谢。
答案 0 :(得分:2)
let offset = 4 * (width * row) + col
当row
和col
为0时,这会给出0的偏移量 - 这没关系。
当row
为0且col
为1时,这会给出1的偏移量 - 这不合适,我们只是与前一个像素相撞。
修复只是添加括号:
let offset = 4 * ((width * row) + col)
现在row
为0,col
为1给出4 - 这是正确的。
虽然,除非你特别需要处理像素位置 - 我通常只是喜欢在一个循环中循环像素数据。例如:
for i in 0 ..< width*height {
let offset = 4 * i
print("\(pixels[offset]) ", terminator:"")
print("\(pixels[offset + 1]) ", terminator:"")
print("\(pixels[offset + 2]) ", terminator:"")
print("\(pixels[offset + 3]) ", terminator:"")
print(" | ", terminator:"")
print(" ")
}