将base64字符串转换为JPG

我将 获取 ,下面是将转换dataurl为图片的函数,

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

问题是当我上传png时效果很好,但是当我

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")

}

输入dataurl为:

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

这可能有帮助

回答:

您将您的传递io.Readerpng.Decode(),这开始消耗阅读器,只是发现输入不是有效的PNG,因此返回错误。

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

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

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

// ...

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

还是更好,请考虑MIME类型,仅调用适当的解码器:

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 的全部内容, 来源链接: utcz.com/qa/431474.html

回到顶部