Je suis en train de développer une application qui cache le texte en utilisant la méthode de stéganographie appelée LSB, en la mettant dans l'image. Mais au cours des tests, j'ai trouvé que lorsque vous enregistrez une image dans la galerie, puis chargez à partir de là, ses valeurs RVB ont des changements. Ce sont les valeurs rouges:Swift 3 - Sauvegarde d'un changement d'image Valeurs RVB
34 -> 41
29 -> 34
44 -> 46
63 -> 62
101 -> 105
118 -> 119
Gauche - ce qu'ils étaient, à droite, ce qu'ils deviennent. Bien sûr, un tel changement détruit complètement le texte caché à l'intérieur. Voici le code que je utilise pour enregistrer une image:
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)
}
}
Et c'est la façon dont j'extraire les valeurs RVB:
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
}
je besoin d'un moyen d'enregistrer l'image exactement comme est. De l'aide?
Modifier 1. Le texte à l'image par injection func:
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!
}
Lorsque vous enregistrez l'image, est-ce au format JPEG? – Reti43
Oui, je l'ai testé sur mes photos .jpg et sur les images par défaut de la galerie sur Simulator – askrav
Vous ne pouvez pas utiliser les photos jpg avec substitution LSB, car le format d'image est lossy (les pixels peuvent être modifiés pendant le stockage pour obtenir la compression). Utilisez bmp, png ou tout autre format sans perte à la place. – Reti43