image.Decode () неизвестный формат - PullRequest
1 голос
/ 11 июля 2020

У меня есть изображение, которое хранится в файловой системе. Этот файл необходимо преобразовать в изображение, а затем изменить его размер. Я знаю, как изменить его размер, но не могу расшифровать изображение. Какой бы путь к изображению / изображение я не вставлял в программу, результат будет: image: unknown format.

Я уже прочитал все сайты об этой проблеме, но ни один из них мне не помог. Этот код представляет мою упрощенную программу logi c (я хотел бы понять, почему возникает эта ошибка). Заранее спасибо за внимание!

import (
    "bufio"
    "fmt"
    "image"
    "image/png"
    _ "image/jpeg"
    _ "image/png"
    "log"
    "os"
)

func main() {

    file, err := os.Open(`D:\photos\img.png`)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    config, format, err := image.DecodeConfig(bufio.NewReader(file))
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(format, config.Height, config.Width, config.ColorModel)
    decodedImg, format, err := image.Decode(bufio.NewReader(file))  // ERROR HERE
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(format,"decode")
    outputFile, err := os.Create(`D:\photos\image.png`)
    if err != nil {
        log.Fatal(err)
    }
    defer outputFile.Close()
    png.Encode(outputFile, decodedImg)

}

Вывод:

png 512 512 &{0x4ae340}
2020/07/11 09:37:10 image: unknown format

1 Ответ

4 голосов
/ 11 июля 2020

Оба image.Decode и image.DecodeConfig потребляют байты из переданного io.Reader.

Это означает, что после выполнения DecodeConfig , позиция в файле после уже прочитанных байтов. Затем image.Decode приходит вместе с тем же базовым файлом, ожидает найти заголовок изображения, но не находит.

bufio.NewReader не сбрасывает позицию в начало файла (поскольку он не может, он знает только базовый объект io.Reader).

У вас есть несколько решений (в порядке или личных предпочтениях):

  • искать назад к началу файла перед вызовом image.Decode. например: newOffset, err := file.Seek(0, 0)
  • не используйте image.DecodeConfig (это может быть не вариант)
  • прочтите файл в []byte и используйте bytes.Buffer
  • снова открыть файл (не особенно эффективно)

В качестве примечания, вам не нужно оборачивать объект os.File в bufio.Reader, он уже реализует io.Reader интерфейс.

...