Неверный формат: не файл PNG - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть код, который загружает изображения из AWS S3, декодирует их и изменяет их размер. Код поддерживает изображения в форматах PNG и JPG / JPEG.

Вот как я загружаю изображения с AWS S3:

//downloads an image from S3
func downloadImage(bucket string, item string) error {
file, err := os.Create(strings.Split(item, "/")[len(strings.Split(item, "/"))-1])
if err != nil {
    fmt.Println("Unable to open file", err)
    return err
}
//create a new AWS session
sess, err := session.NewSession(&aws.Config{
    Region: aws.String("eu-west-1")},
)
//create the s3 downloader
downloader := s3manager.NewDownloader(sess)

defer file.Close()
//download the image from S3
numBytes, err := downloader.Download(file,
    &s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(item),
    })
if err != nil {
    fmt.Println("Unable to download item", item)
    fmt.Println(err)
    return err
}

fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
return nil
}

Вот как я декодирую изображения:

file, err := os.Open(image)
if err != nil {
    fmt.Println(err)
    return err
}
if strings.Split(image, ".")[len(strings.Split(image, "."))-1] == "jpg" ||
    strings.Split(image, ".")[len(strings.Split(image, "."))-1] == "jpeg" {
    img, err := jpeg.Decode(file)

    if err != nil {
        fmt.Println(err)
        return err
    }
    file.Close()
}
else if strings.Split(image, ".")[len(strings.Split(image, "."))-1] == "png" {
    img, err := png.Decode(file)

    if err != nil {
        fmt.Println(err)
        return err
    }
    file.Close()
}

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

выдает следующую ошибку:

png: invalid format: not a PNG file

Я запускаю все на Ubuntu 16.04. Что странно, если я открою это изображение с помощью средства просмотра изображений, оно выдаст ту же ошибку. Однако, если я открою с помощью любой другой программы, такой как: ImageMagick, изображение откроется без каких-либо жалоб.

Как я могу преодолеть эту проблему в коде Голанга?

1 Ответ

0 голосов
/ 04 сентября 2018

По-видимому, даже если имя расширения является .png, а его тип содержимого - PNG, это не обязательно изображение PNG. Единственный способ узнать наверняка - изучить заголовок изображения.

Одним из способов решения этой проблемы с GoLang является использование общей функции image.Decode(), которая определяет тип изображения на основе реестра в соответствии с предложением @ icza

...