2017-02-10 3 views
0

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! 
    } 
+0

Lorsque vous enregistrez l'image, est-ce au format JPEG? – Reti43

+0

Oui, je l'ai testé sur mes photos .jpg et sur les images par défaut de la galerie sur Simulator – askrav

+1

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

Répondre

-1

Eh bien, je ne sais pas comment cela fonctionne, mais cela fonctionne. Je ajouté avant de sauvegarder l'image cryptée:

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

Peut-être cela est un spécificateur explicite d'économie en .PNG.

De toute façon, le problème est résolu.

0

Vous devez enregistrer dans un format non compressé. Je ne sais pas programmer en swift 3. J'ai résolu les mêmes questions en Objective-c en utilisant ALAssetsLibrary.

+0

Ceci est une réponse inutile, plus comme un commentaire. La nécessité de sauvegarder dans un format non compressé a déjà été soulignée dans les commentaires. – Reti43

+0

Merci pour votre suggestion. Je suis un nouveau venu et je m'entraîne à répondre à la question. Je ferais attention la prochaine fois. – killerray