Swift 3 - 保存图像更改RGB值

时间:2017-02-10 14:41:26

标签: image swift3 rgba steganography

我正在开发一个应用程序,它使用名为LSB的隐写方法隐藏文本,并将其放入图像中。但在测试过程中,我发现当您在图库中保存图像然后从那里加载图像时,它的RGB值会发生变化。这是红色值:

34 -> 41
29 -> 34
44 -> 46
63 -> 62
101 -> 105
118 -> 119

左 - 他们是什么,对,他们成为什么。当然这样的改变完全破坏了隐藏在里面的文本。这是我用来保存图片的代码:

 UIImageWriteToSavedPhotosAlbum(newImg, self, #selector(image(_:didFinishSavingWithError:contextInfo:)), nil)


 func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        if let error = error {
            let ac = UIAlertController(title: "Saving error", message: error.localizedDescription, preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default))
            present(ac, animated: true)
        } else {
            let ac = UIAlertController(title: "Saved!", message: "Saved to the gallery", preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default))
            present(ac, animated: true)
        }
    }

这就是我提取RGB值的方式:

func pixelData(image: UIImage) -> [UInt8]? {
    let size = image.size
    let dataSize = size.width * size.height * 4
    var pixelData = [UInt8](repeating: 0, count: Int(dataSize))
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let context = CGContext(data: &pixelData,width: Int(size.width), height: Int(size.height), bitsPerComponent: 8, bytesPerRow: 4 * Int(size.width), space: colorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
    guard let cgImage = image.cgImage else { return nil }
    context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

    return pixelData
}

我需要一种方法来保存图像。有什么帮助吗?

编辑1.文本到图像注入功能:

func encrypt(image: UIImage, message: String) -> UIImage {

        var text = message
        text += endSymbols   //Need to decrypt message


        var RGBArray = pixelData(image: image)!
        let binaryMessage = toBinary(string: text) //Convert characters to binary ASCII number
         var counter: Int = 0

        for letter in binaryMessage {
            for char in letter.characters {

                let num = RGBArray[counter]
                let characterBit = char
                let bitValue = UInt8(String(characterBit))
                let resultNum = (num & 0b11111110) | bitValue!
                RGBArray[counter] = resultNum
                counter += 4 //Modify only RED values bits 
            }
        }

        let resultImg = toImage(data: RGBArray, width: Int(image.size.width), height: Int(image.size.height))
        return resultImg!
    }

2 个答案:

答案 0 :(得分:0)

您需要以未压缩格式保存。我不知道如何在swift 3中编程。我使用ALAssetsLibrary在Objective-c中解决了相同的问题。

答案 1 :(得分:-1)

好吧,我不知道它是如何工作的,但它确实有效。 我在保存加密图片之前添加了这个:

        let imageData = UIImagePNGRepresentation(encryptedImg)
        encryptedImg = UIImage(data: imageData!)!

也许这是一个明确的说明者保存在.PNG。

无论如何,这个问题已经解决了。