一琅攘,生成
生成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ù)大小分配一個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 編輯出錯")
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 編輯出錯")
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)的時候就報錯了,出現(xiàn)了標(biāo)題內(nèi)的報錯编检√ナ常看了一大堆資料都解決不了,看了源碼里面的錯誤條件蒙谓,顯示如下
image.png
這里的這個條件說斥季,如果你的byte中數(shù)據(jù)不是以十六進(jìn)制的FF開頭,或者第二個不是soiMarker(內(nèi)如是0xd8 ),那就報錯酣倾。找了很多資料都沒有解決舵揭,最后不用這個了,直接暴力進(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)一下真的很感謝