LINUX.ORG.RU

Golang: base64 to .png

 ,


0

2

Всем привет!

Как можно перегнать base64 в .png или .jpg используя чудный язык golang? Меня даже больше интересует какую библиотеку для этого нужно использовать?


Сейчас тебе расскажут почему нельзя это сделать без дженериков

А вообще

Меня даже больше интересует какую библиотеку

Внезапно base64 и image

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)

А есть разница, что содержит в себе base64? Декодируй, да сохраняй себе файло на диск. Что у тебя в base64 закодировано? Сырые данные, или уже в png? Правильно заданный вопрос - половина ответа.

Pentium02 ★★
()
Ответ на: комментарий от Xwo

Так тут милая девушка девелопер перегоняет jpg в png или gif.

gadzira
() автор топика
Ответ на: комментарий от Deleted

This. Для более развернутого ответа нужна более конкретная постановка задачи.

anonymous
()
Ответ на: комментарий от gadzira

Декодируй себе, да сохраняй на диск. Если необходимо производить какие-то манипуляции с изображением, то гугли библиотеку для работы с изображениями (я кэп, да), или используй стандартную https://golang.org/pkg/image

//Впрочем, тут до меня всё правильно сказали

Pentium02 ★★
()
Последнее исправление: Pentium02 (всего исправлений: 1)
Ответ на: комментарий от Pentium02

Я сейчас задам глупый вопрос, но сначала предыстория: я перегнал png в base64, потом сложил в базу. Выгрузил из базы, в base64. И теперь вопрос: а дальше-то что? Могу декодировать сразу в png? Я просто не до конца сам процесс понимаю.

Функцию makeImageIzBase64() я не нашел.

gadzira
() автор топика
Ответ на: комментарий от gadzira

Зачем ты полез в гошланг? Зачем ты сложил картинки в базу?

Сохраняй их в файлы, храни в базе только имя файла.

Но, вообще, достав из base64 ты получишь образ файла, который был до base64 кодирования. В этом виде кодируют не только картинки, но и что угодно. Сохранишь на диск - будет тебе файл с картинкой(если до этого туда сложили картинку).

nihirash ★★★
()
Ответ на: комментарий от gadzira

Покажи код, которым кодируешь, и складываешь в базу. Если ты просто прочитал файл, закодировал в base64, положил в базу, то:
1. Декодируешь base64
2. Полученные байтики просто пишешь в файл на диск и всё.

Pentium02 ★★
()
Ответ на: комментарий от Pentium02

Я конечно тот еще go-боярин, но вот:

package main

import (
        "database/sql"
        "fmt"
        _ "github.com/lib/pq"
        "io/ioutil"
        "log"
        "os"
        b64 "encoding/base64"
        "reflect"
)

const DB_CONNECT_STRING = "host=localhost port=5432 user=User dbname=dbname sslmode=disable"
const PATH_TO_FILE = "/Users/User/Image/"

func main() {
        if _, err := os.Stat(PATH_TO_FILE); os.IsNotExist(err) {
                fmt.Printf("File not exist", err)
        } else {
                files, err := ioutil.ReadDir(PATH_TO_FILE)
                if err != nil {
                        log.Fatal(err)
                }
                db, err := sql.Open("postgres", DB_CONNECT_STRING)
                defer db.Close()

                if err != nil {
                        fmt.Printf("Database opening error -->%v\n", err)
                        panic("Database error")
                        log.Fatal(err)
                }
                for i, f := range files[1:] {
                        bs, err := ioutil.ReadFile(PATH_TO_FILE + f.Name())
                        if err != nil {
                            return
                        }
                        str := string(bs)
                        sEnc := b64.StdEncoding.EncodeToString([]byte(str))
                        db.Exec("UPDATE photo set img=$1 WHERE id=$2 AND author IS NOT NULL;", sEnc, (i + 1))
                }

        }
}

1. Декодируешь base64
2. Полученные байтики просто пишешь в файл на диск и всё.

Ок, сейчас попробую. Т.е. не нужно создавать какие-то фреймы и структуры?

gadzira
() автор топика
Ответ на: комментарий от nihirash

Ну что ты начинаешь, нормально ж общались. Полез по необходимости.

Ты правильно говоришь, я так и предлагал, но делать нужно неправильно, тк это костыль.

Ок, я кажется понял где косячу, сейчас проверю.

gadzira
() автор топика
Ответ на: комментарий от gadzira

Т.е. не нужно создавать какие-то фреймы и структуры?

Они все есть в изначальном файле, который сложился в base64.

Base64 - это просто способ кодирования данных с ограниченной разрядоностью данных. Вот и все. Мог, в принципе, сохранить даже в UUE.

nihirash ★★★
()
Ответ на: комментарий от nihirash

jpg'ги конечно создаются, но когда их пытаешься открыть - Не удалось открыть файл

ЧЯДН ?

if _, err := os.Stat(PATH_TO_FILE); os.IsNotExist(err) {
        fmt.Printf("File not exist", err)
} else {
        files, err := ioutil.ReadDir(PATH_TO_STORE)
        if err != nil {
                log.Fatal(err)
        }
        for _, v := range files[1:] {
                bs, err := ioutil.ReadFile(PATH_TO_STORE + v.Name())

        if err != nil {
                 panic(err)
        }
        str := string(bs)
        sDec, err := b64.StdEncoding.DecodeString(str)

        r, err := os.Open(PATH_TO_STORE + v.Name())
        if err != nil {
                panic(err)
        }
        defer r.Close()

        w, err := os.Create(PATH_TO_STORE + v.Name() + ".jpg")
        if err != nil {
                panic(err)
        }
        defer w.Close()

        n, err := io.Copy(w, r)
        if err != nil {
                panic(err)
        }
    }
}

gadzira
() автор топика
Ответ на: комментарий от gadzira

Вот работающее, на коленке за несколько минуток. Ищи, что ты делаешь не так

package main

import (
  "io/ioutil"
  "encoding/base64"
)

func main() {
  //Читаем png файл
  pngData, err := ioutil.ReadFile("sample.png")
  if err != nil {
    //ВСЕ ПРОПАЛО!!1!!ОДИНОДИН
    panic(err)
  }	

  //Кодируем в base64
  b64String := base64.StdEncoding.EncodeToString(pngData)	

  //Записываем результат кодирования
  err = ioutil.WriteFile("sample.b64", []byte(b64String), 0644)

  if err != nil {
    panic(err)
  }

  //Читаем base64
  b64Data, err := ioutil.ReadFile("sample.b64")
  if err !=nil {
    panic(err)
  }

  //Декодируем base64
  outPngData, err := base64.StdEncoding.DecodeString(string(b64Data))

  if err != nil {
    panic(err)
  }

  //Записываем результат декордирования
  err = ioutil.WriteFile("sample.out.png", outPngData, 0644)

  if err != nil {
    panic(err)
  }	
}

Pentium02 ★★
()
Последнее исправление: Pentium02 (всего исправлений: 1)

1. декодируешь base64 2. определяешь формат, если он не известен. 3. записываешь в файл, если надо - или парсишь изображение.

На какой стадии проблемы?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.