图像到UInt8转换Swift扭曲图像

时间:2016-04-05 16:09:27

标签: ios arrays swift image int

这是this thread的延续。我的第一个问题得到了回答,所以我认为继续评论和扩展问题是不礼貌的。

使用下面的代码,我将RGBA图像转换为整数数组。但是,当我转换回图像时,数据很奇怪。 我的反向转换过程不是问题,因为当我在创建时调试像素数组时,像素与原始图像不匹配:它们与失真的像素匹配。

我想知道这些问题可能是什么来源。

Original stock image

After conversion and back conversion

代码:

   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(" ")
    }
}

一切都有帮助!再次感谢。

1 个答案:

答案 0 :(得分:2)

您的偏移逻辑略有缺陷

let offset = 4 * (width * row) + col

rowcol为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(" ")
}