2015-10-24 2 views
1

Im в настоящее время получить URL данных base64 изображения из брезентовой что-то вроде этого (не dataurl им получать только, чтобы показать, как строка выглядит)Go расшифровывает base64 изображение

data:image/png;base64,iVkhdfjdAjdfirtn= 

мне нужно декодировать этот образ проверить ширину и высоту изображения

dataurl := strings.Replace(req.PostFormValue("dataurl"), "data:image/png;base64,", "", 1) 

    reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(dataurl)) 
    c, _, err := image.DecodeConfig(reader) 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Println(c.Width) 

Но Im получаю сообщение об ошибке при попытке расшифровать конфигурационный

Unknown image format 

Так что да, как Im, делающий dataurl, должен быть неправильным, но не может определить, что делать. Я также попытался прохождения полного dataurl (с данными: изображение ...) до сих пор нет успеха

+0

Я не думаю, что вы не получаете действительные данные base64. Выполнение 'echo -n" iVkhdfjdAjdfirtn = "| base64 -d> image.png' также указывает, что ваши данные недействительны. –

+0

Thtat был примером dataurl Im получение массивным, чтобы поместить его здесь –

ответ

4

Что у вас есть это Data URI scheme, информация о том, как его расшифровать и больше на этом в этом вопросе и ответ:

Illegal base64 data at input byte 4 when using base64.StdEncoding.DecodeString(str)

Но обратите внимание, что image.Decodeconfig() будет только декодировать форматы изображения, зарегистрированные до вызова этой функции, так что вам нужно обработчики формата изображения должны быть зарегистрированы заранее. Это может быть сделано с импортом, как

import _ "image/png" 

Более подробно об этом в пакете РОУ image. Или, если вы знаете точный формат (например, в вашем примере это PNG), вы можете напрямую использовать png.DecodeConfig().

Это не работает для вас, потому что ваше фактическое кодированное изображение имеет формат PNG, но вы не зарегистрировали обработчик формата PNG, и поэтому image.DecodeConfig() не будет использовать обработчик PNG (и так не будет способный декодировать его =>"Unknown image format").

Также обратите внимание, что замена префикса, который не является частью кодированного изображения Base64, является плохим решением для его устранения. Вместо того, чтобы просто нарезать строку ввода:

input := "data:image/png;base64,iVkhdfjdAjdfirtn=" 
b64data := input[strings.IndexByte(input, ',')+1:] 

нарезка строки не будет даже копировать строку в памяти, она будет просто создать новый заголовок строки (из двух слов).

+0

Можете ли вы обновить этот ответ, который можно использовать как для jpg, так и для png-изображений – mchampaneri

Смежные вопросы