濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫(xiě)入圖片中

go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫(xiě)入圖片中

熱門(mén)標(biāo)簽:騰訊外呼系統(tǒng)價(jià)格 谷歌便利店地圖標(biāo)注 百度地圖標(biāo)注搜索關(guān)鍵詞 ?兓? 浙江人工智能外呼管理系統(tǒng) 成都呼叫中心外呼系統(tǒng)平臺(tái) 最短的地圖標(biāo)注 電梯外呼訪客系統(tǒng) 電銷機(jī)器人可以補(bǔ)救房產(chǎn)中介嗎

原理:將數(shù)據(jù)的二進(jìn)制形式寫(xiě)入圖像紅色通道數(shù)據(jù)二進(jìn)制的低位
只支持png格式的輸出
寫(xiě)入數(shù)據(jù)
go run shadow.go -in="c.jpg" -data="hide me" -out="out.png"
讀取數(shù)據(jù)
go run shadow.go -in="out.png"

復(fù)制代碼 代碼如下:

package main
import (
    "errors"
    "flag"
    "fmt"
    "image"
    "image/color"
    _ "image/jpeg"
    "image/png"
    "log"
    "math"
    "os"
)
var FLAG = [4]byte{0x13, 0x14, 0x52, 0x00} //shadow flag.
//byte to 8 bits
func Byte2bits(b byte) (a [8]byte) {
    var c uint8 = 7
    var i uint8
    for i = 0; i 8; i++ {
        a[i] = b >> (c - i) 1
    }
    return
}
//8 bits to byte.
func Bits2Byte(a [8]byte) (b byte) {
    for i := 0; i 8; i++ {
        b += a[i] * uint8(math.Pow(2, float64(7-i)))
    }
    return
}
//uint32 to 4 bytes.
func Uint32ToBytes(i uint32) (b [4]byte) {
    b[0] = uint8(i >> 24)
    b[1] = uint8(i >> 16 0xffff)
    b[2] = uint8(i >> 8 0xff)
    b[3] = uint8(i 0xff)
    return
}
//4 bytes to uint32.
func Bytes2Uint32(b [4]byte) (i uint32) {
    var j uint32
    for ; j 4; j++ {
        i += uint32(b[j]) (24 - j*8)
    }
    return
}
func BuildShadowHeader(length uint32) (b [8]byte) {
    var i int
    for ; i 4; i++ {
        b[i] = FLAG[i]
    }
    a := Uint32ToBytes(length)
    for ; i 8; i++ {
        b[i] = a[i-4]
    }
    return
}
func WriteShadow(b []byte, im image.Image) (out image.Image, err error) {
    max := im.Bounds().Max.X*im.Bounds().Max.Y/8 - 64
    b_len := len(b)
    if len(b) > max {
        return nil, errors.New("image does not have enough space for shadow.")
    }
    head := BuildShadowHeader(uint32(b_len))
    var bb byte
    var bs [8]byte
    var i int
    out, err = SetImage(im, func(index, x, y int, in, out image.Image) {
        rgba := readRGBAColor(im.At(x, y))
        if index b_len*8+64 {
            if index 64 {
                bb = head[index/8]
            } else {
                bb = b[index/8-8]
            }
            bs = Byte2bits(bb)
            i = index % 8
            if bs[i] != rgba.R1 {
                if bs[i] == 0 {
                    rgba.R -= 1
                } else {
                    rgba.R += 1
                }
            }
        }
        if v := out.(*image.RGBA); v != nil {
            v.SetRGBA(x, y, rgba)
        }
    })
    if err != nil {
        return nil, err
    }
    return
}
func ReadShadowData(im image.Image) (b []byte, err error) {
    head, err := ReadShadowHeader(im)
    if err != nil {
        return nil, err
    }
    length := int(ReadShadowLength(head))
    var bk []byte = make([]byte, length*8)
    b = make([]byte, length)
    _, err = SetImage(im, func(index, x, y int, in, out image.Image) {
        if index >= 64 index length*8+64 {
            R := readRGBAColor(im.At(x, y)).R
            bk[index-64] = uint8(R 1)
        }
    })
    var bb [8]byte
    var bs []byte
    for i := 0; i length; i++ {
        bs = bk[8*i : 8*(i+1)]
        for j := 0; j 8; j++ {
            bb[j] = bs[j]
        }
        b[i] = Bits2Byte(bb)
    }
    return
}
func ReadShadowHeader(im image.Image) (b [8]byte, err error) {
    var bm [64]byte
    _, err = SetImage(im, func(index, x, y int, in, out image.Image) {
        rgba := readRGBAColor(im.At(x, y))
        if index 64 {
            bm[index] = uint8(rgba.R 1)
        }
    })
    if err != nil {
        return
    }
    var bb [8]byte
    var bs []byte
    for i := 0; i 8; i++ {
        bs = bm[8*i : 8*(i+1)]
        for j := 0; j 8; j++ {
            bb[j] = bs[j]
        }
        b[i] = Bits2Byte(bb)
    }
    return
}
func ReadShadowFlag(b [8]byte) (a [4]byte) {
    for i := 0; i 4; i++ {
        a[i] = b[i]
    }
    return
}
func ReadShadowLength(b [8]byte) uint32 {
    var bb [4]byte
    for i := 4; i 8; i++ {
        bb[i-4] = b[i]
    }
    return Bytes2Uint32(bb)
}
func OpenImage(path string) (image.Image, error) {
    im_read, err := os.Open(path)
    defer im_read.Close()
    if err != nil {
        return nil, err
    }
    im, _, err := image.Decode(im_read)
    if err != nil {
        return nil, err
    }
    return im, nil
}
//modify image
func SetImage(im image.Image, f func(index, x, y int, in, out image.Image)) (out image.Image, err error) {
    if f == nil {
        return im, nil
    }
    index := 0
    bounds := im.Bounds()
    out = image.NewRGBA(bounds)
    var m *image.RGBA = out.(*image.RGBA)
    for y := bounds.Min.Y; y bounds.Max.Y; y++ {
        for x := bounds.Min.X; x bounds.Max.X; x++ {
            m.Set(x, y, im.At(x, y))
            f(index, x, y, im, out)
            index += 1
        }
    }
    return out, nil
}
//conert any color to RABGA color.
func readRGBAColor(from_color color.Color) color.RGBA {
    return color.RGBAModel.Convert(from_color).(color.RGBA)
}
//only write to jpeg formats.
func WriteImage(path string, im image.Image) error {
    out, err := os.OpenFile(path, os.O_CREATE, os.ModePerm)
    defer out.Close()
    if err != nil {
        return err
    }
    err = png.Encode(out, im)
    if err != nil {
        return err
    }
    return nil
}
var read_in string
var write_out string
var data string
func init() {
    flag.StringVar(read_in, "in", "", "image path read in.")
    flag.StringVar(write_out, "out", "out.jpg", "image path write out.")
    flag.StringVar(data, "data", "", "data to shadow.")
}
func errHandle(err error) {
    if err != nil {
        log.Fatal(err)
    }
}
func main() {
    flag.Parse()
    if read_in == "" {
        fmt.Println("Options:")
        flag.PrintDefaults()
        return
    }
    im, err := OpenImage(read_in)
    errHandle(err)
    if data != "" {
        out, err := WriteShadow([]byte(data), im)
        errHandle(err)
        err = WriteImage(write_out, out)
        errHandle(err)
    } else {
        head, err := ReadShadowHeader(im)
        errHandle(err)
        _flag := ReadShadowFlag(head)
        if _flag != FLAG {
            fmt.Println("image doesn't have shadow data.")
            return
        }
        data, err := ReadShadowData(im)
        errHandle(err)
        fmt.Println("shadow:", string(data))
    }
}

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

您可能感興趣的文章:
  • Django Admin實(shí)現(xiàn)上傳圖片校驗(yàn)功能
  • Django實(shí)現(xiàn)圖片文字同時(shí)提交的方法
  • Django中實(shí)現(xiàn)點(diǎn)擊圖片鏈接強(qiáng)制直接下載的方法
  • go語(yǔ)言讀取json并下載高清妹子圖片
  • go語(yǔ)言實(shí)現(xiàn)抓取高清圖片
  • GO語(yǔ)言實(shí)現(xiàn)批量壓縮圖片和水印
  • Go語(yǔ)言圖片處理和生成縮略圖的方法
  • golang實(shí)現(xiàn)通過(guò)smtp發(fā)送電子郵件的方法
  • golang基于websocket實(shí)現(xiàn)的簡(jiǎn)易聊天室程序
  • golang使用sort接口實(shí)現(xiàn)排序示例
  • golang守護(hù)進(jìn)程用法示例
  • golang實(shí)現(xiàn)http服務(wù)器處理靜態(tài)文件示例
  • golang image圖片處理示例

標(biāo)簽:七臺(tái)河 上海 雅安 紹興 盤(pán)錦 宜昌 眉山 邢臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫(xiě)入圖片中》,本文關(guān)鍵詞  語(yǔ)言,實(shí),現(xiàn)將,重要,數(shù)據(jù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫(xiě)入圖片中》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于go語(yǔ)言實(shí)現(xiàn)將重要數(shù)據(jù)寫(xiě)入圖片中的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    屯昌县| 清新县| 广汉市| 旌德县| 万盛区| 二手房| 栖霞市| 贵南县| 庆阳市| 乌鲁木齐市| 达拉特旗| 水城县| 桂平市| 铁力市| 三都| 平顶山市| 呼伦贝尔市| 资源县| 阿拉善盟| 渭南市| 海兴县| 清苑县| 桓台县| 昆山市| 贡觉县| 云和县| 海阳市| 乾安县| 道孚县| 凉山| 米易县| 阜城县| 枣强县| 玉屏| 阿坝县| 哈巴河县| 米林县| 正阳县| 延长县| 宝清县| 隆安县|