base64轉(zhuǎn)為圖片的invalid JPEG format: missing SOI marker問題

一,生成

生成base64的格式代碼,這一步基本沒有問題

func PhotoToBase64(url string) (string, error) {
    imgFile, err := os.Open(url) // a QR code image
    if err != nil {
        return "", err
    }
    defer imgFile.Close()
    fInfo, _ := imgFile.Stat() //返回文件結(jié)構(gòu)
    size := fInfo.Size()       //獲取文件大小
    buf := make([]byte, size)  //根據(jù)大小分配一個(gè)byte數(shù)組
    fReader := bufio.NewReader(imgFile)
    fReader.Read(buf)
    imgBase64Str := base64.StdEncoding.EncodeToString(buf)
    // imgBase64Str := base64.RawStdEncoding.EncodeToString(buf)
    // if err := dataTofile("data:image/jpeg;base64," + imgBase64Str); err != nil {//默認(rèn)是不產(chǎn)生頭標(biāo)志的,需要自己添加
    if err := dataTofile(imgBase64Str); err != nil {
        return "", err
    }
    return imgBase64Str, nil
}

二,解析
這里首先將上述base64轉(zhuǎn)為png格式的圖片,代碼如下

func base64ToPngimage(imagebase64 string) error {
    debytes, err := base64.StdEncoding.DecodeString(imagebase64)
    if err != nil {
        return err
    }
    bt := bytes.NewReader(debytes)

    image, err := png.Decode(bt)
    if err != nil {
        log.Println("png 編輯出錯(cuò)")
        return err
    }
    f, err := os.OpenFile("./file/"+GetUniqueFileName()+".png", os.O_WRONLY|os.O_CREATE, 0777) //等待拆分
    if err != nil {
        return err
    }
    // f.Write(debytes)
    defer f.Close()
    png.Encode(f, image) //Options是編碼參數(shù),它的取值范圍是1-100,值越高質(zhì)量越好
    return nil
}

這里也沒有問題,正常執(zhí)行,隨后進(jìn)行jpeg的轉(zhuǎn)碼,代碼如下:

func base64ToJpgimage(imagebase64 string) error {
    debytes, err := base64.StdEncoding.DecodeString(imagebase64)
    if err != nil {
        return err
    }
    bt := bytes.NewReader(debytes)

    image, err := jpeg.Decode(bt)
    if err != nil {
        log.Println("jpeg 編輯出錯(cuò)")
        return err
    }
    f, err := os.OpenFile("./file/"+GetUniqueFileName()+".png", os.O_WRONLY|os.O_CREATE, 0777) //等待拆分
    if err != nil {
        return err
    }
    // f.Write(debytes)
    defer f.Close()
    jpeg.Encode(f, image, &jpeg.Options{Quality: 100}) //Options是編碼參數(shù),它的取值范圍是1-100,值越高質(zhì)量越好
    return nil
}

當(dāng)執(zhí)行到jpeg.Decode(bt)的時(shí)候就報(bào)錯(cuò)了,出現(xiàn)了標(biāo)題內(nèi)的報(bào)錯(cuò)??戳艘淮蠖奄Y料都解決不了,看了源碼里面的錯(cuò)誤條件,顯示如下

image.png

這里的這個(gè)條件說,如果你的byte中數(shù)據(jù)不是以十六進(jìn)制的FF開頭,或者第二個(gè)不是soiMarker(內(nèi)如是0xd8 ),那就報(bào)錯(cuò)。找了很多資料都沒有解決,最后不用這個(gè)了,直接暴力進(jìn)入,霸王開工

//base64ToJpgimage base64轉(zhuǎn)為jpeg圖片
func base64ToJpgimage(imagebase64 string) error {
    debytes, err := base64.StdEncoding.DecodeString(imagebase64)
    if err != nil {
        return err
    }
    f, err := os.OpenFile("./file/"+GetUniqueFileName()+".jpeg", os.O_WRONLY|os.O_CREATE, 0777) //等待拆分
    if err != nil {
        return err
    }
    f.Write(debytes)//直接寫入
    defer f.Close()
    return nil
}

雖然有官方的包可以使用,但是最后真的沒辦法了,有哪位大神能指導(dǎo)一下真的很感謝

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

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