Я разрабатываю приложение, которое скрывает текст, используя метод стеганографии под названием LSB, помещая его в изображение. Но во время тестирования я обнаружил, что когда вы сохраняете изображение в галерее, а затем загружаете его оттуда, это значения RGB имеют изменения. Это красные значения:Swift 3 - Сохранение смены изображения Значения 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
}
Мне нужен способ, чтобы сохранить изображение точно так, как является. Любая помощь?
Edit 1. Текст изображения литьевого 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!
}
Когда вы сохраняете изображение, оно находится в формате JPEG? – Reti43
Да, я тестировал его на моих .jpg фотографиях и на изображениях по умолчанию Apple из галереи на Simulator – askrav
Вы не можете использовать jpg-фотографии с заменой LSB, потому что формат изображения является потерянным (пиксели могут быть изменены во время хранения для достижения сжатия). Вместо этого используйте bmp, png или любой другой формат без потерь. – Reti43