SmartQuery /ВОПРОС → ПРИМЕР → ПОНЯТНЫЙ ОТВЕТ
Языки и платформы

Чтение и запись PNG в Go без внешних библиотек

Для декодирования и кодирования PNG используйте стандартный пакет image/png. Устанавливать github.com/fogleman/gg для этих операций не нужно: это отдельная библиотека рисования.

Прочитать и сохранить изображение

package main

import (
    "image/png"
    "log"
    "os"
)

func main() {
    in, err := os.Open("image.png")
    if err != nil { log.Fatal(err) }
    img, err := png.Decode(in)
    closeErr := in.Close()
    if err != nil { log.Fatal(err) }
    if closeErr != nil { log.Fatal(closeErr) }

    out, err := os.Create("output.png")
    if err != nil { log.Fatal(err) }
    err = png.Encode(out, img)
    closeErr = out.Close()
    if err != nil { log.Fatal(err) }
    if closeErr != nil { log.Fatal(closeErr) }
}

Запустите программу в каталоге с доверенным image.png. os.Create создаёт либо перезаписывает output.png. Используйте отдельный путь для результата, если исходный файл нужно сохранить.

Что дают эти функции

Decode превращает поток PNG в image.Image, а Encode записывает изображение в PNG. Масштабирование, фильтры и рисование текста не являются операциями png.Decode или png.Encode: для них нужен отдельный алгоритм или пакет.

Ограничения входных данных

При обработке недоверенных загрузок ограничьте размер файла и размеры изображения до полного декодирования; для чтения метаданных существует DecodeConfig. Корректный заголовок ещё не доказывает, что всё изображение можно безопасно обработать в доступной памяти.

Документация