87.給二維碼加logo,draw.Draw的應(yīng)用實例

go語言對圖片的操作相當方便。無論是生成一張新圖片,還是在現(xiàn)有的圖片上做一些操作。這次,來試試非常流行的圖片上加自己的logo水印。當然,二維碼是比較特殊的一個例子,它不能超過背景圖片的一定比例面積,不然可能會影響二維碼的識別。
首先要準備好疊加的兩個圖片文件,這里我要疊加的文件是 1.png 和 2.png

    file1 := "1.png"
    file2 := "2.png"

    img1, err1 := os.Open(file1)
    img2, err2 := os.Open(file2)

    if err1 != nil {
        log.Println("圖片文件打開錯誤", err1.Error())
    }
    if err2 != nil {
        log.Println("圖片文件打開錯誤", err2.Error())
    }

    mapImg, _, err3 := image.Decode(img1)
    icoImg, _, err4 := image.Decode(img2)
    if err3 != nil {
        log.Println("", err3.Error())
        panic(err3)
    }
    if err4 != nil {
        log.Println("", err4.Error())
        panic(err4)
    }

然后,準備好畫布邊界和水印相對位置。水印的相對位置,是針對背景左上角的位置來說的。

    //--畫布背景邊界
    canvas := image.NewRGBA(mapImg.Bounds())
    fmt.Println(mapImg.Bounds().Size())
    fmt.Println(icoImg.Bounds().Size())
    //--水印logo相對背景左上角的位置
    icoImgPnt := image.Point{(mapImg.Bounds().Size().X-icoImg.Bounds().Size().X)/-2,(mapImg.Bounds().Size().Y-icoImg.Bounds().Size().Y)/-2}

下面是最關(guān)鍵的兩句代碼來了。第一句是畫出背景,第二句是畫出水印logo的。

    draw.Draw(canvas, canvas.Bounds(), mapImg, image.Point{0,0}, draw.Src)
    draw.DrawMask(canvas, canvas.Bounds(), image.Image(icoImg), icoImgPnt, mapImg, image.Point{0,0}, draw.Src)

這里已經(jīng)把需要的內(nèi)容畫出來了,還需要再加上最后一步,把內(nèi)容生成圖片。

    myfile, err := os.Create("new.png")     //  now let's save image
    if err != nil {
        panic(err)
    }
    png.Encode(myfile, canvas)

生成的效果如下圖片如下


image.png

由于上傳文件的限制,生成效果使用的大圖片不是二維碼的,但是不影響技術(shù)實現(xiàn)方法的體驗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容