本文字数:2581字
预计阅读时间:7分钟
技术
背景
水 印
L S B
数字
水印
应用
场景
实 现
static let markBin: [QFLSBMarkBin] = [.key, .lengthBit, .length, .info]
(扩展来变更 length 所占的字节) | ||
class func baseEncode(data: UnsafeMutablePointer<UInt8>, infoData: Data, width w: Int, height h: Int) {
let kQHKeyData = kQFkey.data(using: .utf8)!
let kQHKeyDataCount = kQHKeyData.count
let kLenghtCount = kLengthBit
let markCount = kQHKeyDataCount + kLengthBitCount + kLenghtCount + infoData.count
var bStop = false
var markIndex = -1
var markIndexText: Int = 0
var markBin: QFLSBMarkBin?
var markLengthBitCount = 0
// 1、读取原数据
for y in 0..<h {
if bStop {
break;
}
for x in 0..<w {
let index = (y * w + x)
let markIndexTemp = index / 8
if markIndexTemp >= markCount {
bStop = true
break
}
// 2、水印信息的计算
if markIndex != markIndexTemp {
markIndex = markIndexTemp
if markIndex < kQHKeyDataCount {
markBin = .key
markIndexText = Int(kQHKeyData[markIndex])
}
else if markIndex < kQHKeyDataCount + kLengthBitCount {
markBin = .lengthBit
markIndexText = kLengthBit
}
else if markIndex < kQHKeyDataCount + kLengthBitCount + kLenghtCount {
markLengthBitCount += 1
markBin = .length
if markLengthBitCount == 1 {
markIndexText = markCount%256
}
else if markLengthBitCount == 2 {
markIndexText = Int(markCount>>8)
}
else {
bStop = true
break
}
}
else if markIndex < markCount {
markBin = .info
markIndexText = Int(infoData[markIndex - (kQHKeyDataCount + kLengthBitCount + kLenghtCount)])
}
}
if markBin == nil {
bStop = true
break
}
// 3、读取原数据 & 获取最低有效位
let offset = 4 * index
let red = data[offset+1]
let redBinary = red % 2
let markIndexTextBinaryIndex = index % 8
let markIndexTextBinary = Int((markIndexText / (1<<Int(markIndexTextBinaryIndex))) % 2)
// 4、最低有效位记录
if redBinary != markIndexTextBinary {
if markIndexTextBinary == 0 {
if red == 255 {
data[offset+1] = 254
}
else {
data[offset+1] = red + 1
}
}
else {
if red == 0 {
data[offset+1] = 1
}
else {
data[offset+1] = red - 1
}
}
}
}
}
}
// 逻辑上与 baseEncode 相同,读取原数据后记录到对应的水印数据信息上。
class func baseDecode(data: UnsafeMutablePointer<UInt8>, width w: Int, height h: Int) -> (result: Bool, info: String) {
// ......
return (false, "解密");
}
private func toPng() -> Bool
if !toPng() {
print("showScreenshot toPng 失败")
return
}
let text = "QFScreenshot" as NSString
let p = CGPoint(x: 20, y: 160)
text.draw(at: p, withAttributes: [NSAttributedString.Key.font : UIFont.systemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor(white: 0.5, alpha: 1)])
总 结
其他
用途
改进的
隐形水印
也许你还想看
(▼点击文章标题或封面查看)