将base64字符串转换为JPG [英] Convert base64 string to JPG

查看:157
本文介绍了将base64字符串转换为JPG的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将图像作为base64字符串( dataurl ),下面是我将 dataurl 转换为图像的函数,

现在,如果图像为png,则png库将创建图像,而jpg库将引发错误,反之亦然.

问题是当我上传png时效果很好,但是当我上传jpg文件时
返回此错误

无效的JPEG格式:缺少SOI标记

  func(ProfileController)SetProfilePic(w http.ResponseWriter,r * http.Request){会话_:= session.UserSession.Get(r,"mvc-user-session")var fieldMapForBasic地图[string] * json.RawMessagevar f * os.File数据_:= ioutil.ReadAll(r.Body)json.Unmarshal(data,& fieldMapForBasic)图片,_:= json.Marshal(fieldMapForBasic ["image"])coI:= strings.Index(string(image),,")rawImage:=字符串(图像)[coI + 1:]//编码的图像DataUrl//无基础的_:= base64.StdEncoding.DecodeString(string(rawImage))res:= bytes.NewReader(无基础)路径_:= os.Getwd()//存储图像的路径//newpath:= filepath.Join(path +"/storage",strconv.Itoa(session.Values ["id"].(int)))os.MkdirAll(newpath,os.ModePerm)uid:= uuid.NewV4()fmt.Println(newpath)//如果image为png,则此函数将从dataurl字符串创建图像//pngI,errPng:= png.Decode(res)如果errPng == nil {f,_ = os.OpenFile(newpath +"/" + uid.String()+".png",os.O_WRONLY | os.O_CREATE,0777)png.Encode(f,pngI)fmt.Println(生成的Png")用户:= model.User {}user.ProfilePic =存储/" + strconv.Itoa(session.Values ["id"].(int))+"/" + uid.String()session.Values ["profile_pic"] = user.ProfilePicsession.Save(r,w)database.Connection.Id(session.Values ["id"].(int)).Update(& user)} 别的 {fmt.Println(errPng.Error())}//如果image是Jpg,则将生成Image//jpgI,errJpg:= jpeg.Decode(res)如果errJpg == nil {f,_ = os.OpenFile(newpath +"/" + uid.String()+".jpg",os.O_WRONLY | os.O_CREATE,0777)jpeg.Encode(f,jpgI,& jpeg.Options {Quality:75})fmt.Println(创建Jpg")} 别的 {fmt.Println(errJpg.Error())}延迟func(){f.关闭()}()render.Json(w,"ok")} 

输入 dataurl 是:

 <代码>数据:图像/JPEG; BASE64,/9J/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCADeAN4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4 + Tl5ufo6erx8vP09fb3 + PN6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 + PN6/9oADAMBAAIRAxEAPwDtKKKK/cD8rCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z" 

这可能有帮助

解决方案

您要将 io.Reader 传递给 png.Decode(),后者开始消耗阅读器,只是发现输入不是有效的PNG,所以返回错误.

然后将部分消耗的读取器传递给 jpeg.Decode(),该读取器将读取尚未读取的数据(不是有效的JPEG),并返回您观察到的错误.

您需要为每个解码器创建一个新的阅读器:

  pngI,errPng:= png.Decode(bytes.NewReader(未使用))//...jpgI,errJpg:= jpeg.Decode(bytes.NewReader(未使用)) 

或更妙的是,考虑MIME类型,只调用适当的解码器:

 切换字符串.TrimSuffix(image [5:coI],; base64"){案例"image/png":pngI,err = png.Decode(res)//...案例"image/jpeg":jpgI,err = jpeg.decode(res)//...} 

I am getting the image as base64 string ( dataurl ), Below is my function that converts the dataurl into the image,

Now if the image is png then png library will create the image and jpg library will throw an error and vice versa.

Problem is when i upload png it works well but when i upload jpg file
returns this error

invalid JPEG format: missing SOI marker

func (ProfileController) SetProfilePic(w http.ResponseWriter, r *http.Request) {

    session, _ := session.UserSession.Get(r, "mvc-user-session")

    var fieldMapForBasic map[string]*json.RawMessage
    var f *os.File

    data, _ := ioutil.ReadAll(r.Body)
    json.Unmarshal(data, &fieldMapForBasic)

    image, _ := json.Marshal(fieldMapForBasic["image"])
    coI := strings.Index(string(image), ",")
    rawImage := string(image)[coI+1:]

    // Encoded Image DataUrl //
    unbased, _ := base64.StdEncoding.DecodeString(string(rawImage))

    res := bytes.NewReader(unbased)
    path, _ := os.Getwd()

    // Path to store the image //
    newpath := filepath.Join(path +  "/storage",  strconv.Itoa(session.Values["id"].(int)))
    os.MkdirAll(newpath, os.ModePerm)
    uid := uuid.NewV4()
    fmt.Println(newpath)

    // if image is png this function will create the image from dataurl string //
    pngI, errPng := png.Decode(res)
    if errPng == nil {
        f, _ = os.OpenFile(newpath + "/" + uid.String() + ".png", os.O_WRONLY | os.O_CREATE, 0777)
        png.Encode(f, pngI)
        fmt.Println("Png generated")
        user := model.User{}
        user.ProfilePic = "storage/" + strconv.Itoa(session.Values["id"].(int)) + "/" + uid.String()
        session.Values["profile_pic"] = user.ProfilePic
        session.Save(r, w)
        database.Connection.Id(session.Values["id"].(int)).Update(&user)
    } else {
        fmt.Println(errPng.Error())
    }

    // If image is Jpg this will generate the Image //
    jpgI, errJpg := jpeg.Decode(res)
    if errJpg == nil {
        f, _ = os.OpenFile(newpath + "/" + uid.String() + ".jpg", os.O_WRONLY | os.O_CREATE, 0777)
        jpeg.Encode(f, jpgI, &jpeg.Options{Quality: 75})
        fmt.Println("Jpg created")
    } else {
        fmt.Println(errJpg.Error())
    }

    defer func() {
        f.Close()
    }()

    render.Json(w, "ok")
}

Input dataurl is:

"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCADeAN4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtKKKK/cD8rCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z"

This might help

解决方案

You're passing your io.Reader to png.Decode(), which begins consuming the reader, only to discover that the input is not a valid PNG, so returns an error.

Then your partly-consumed reader is passed to jpeg.Decode(), which reads the data not yet read, which is not a valid JPEG, and returns the error you observe.

You need to create a new reader for each decoder:

pngI, errPng := png.Decode(bytes.NewReader(unbased))

// ...

jpgI, errJpg := jpeg.Decode(bytes.NewReader(unbased))

Or better yet, consider the MIME type, and only call the proper decoder:

switch strings.TrimSuffix(image[5:coI], ";base64") {
case "image/png":
    pngI, err = png.Decode(res)
    // ...
case "image/jpeg":
    jpgI, err = jpeg.Decode(res)
    // ...
}

这篇关于将base64字符串转换为JPG的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆