/
pxlxnski
/
ImageCompressionAlgorhitms
Обзор
Документация
Войти
/
pxlxnski
/
ImageCompressionAlgorhitms
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
pkg/format/decoder.go
102 строки
3 KB
Egor Polyanskiy
RLE algorithm completed
16 дек 2025, 21:57
16 дек 2025, 21:57
2667a8d
Код
Авторство
О чём код?
package format import ( "encoding/binary" "fmt" "io" "os" ) func Decode(r io.Reader) (*CompressedImage, error) { img := &CompressedImage{} var magic uint32 if err := binary.Read(r, binary.LittleEndian, &magic); err != nil { return nil, fmt.Errorf("ошибка чтения magic number: %w", err) } if magic != uint32(MagicNumber) { return nil, ErrInvalidMagic } var version uint16 if err := binary.Read(r, binary.LittleEndian, &version); err != nil { return nil, fmt.Errorf("ошибка чтения version: %w", err) } if version != uint16(Version) { return nil, fmt.Errorf("%w: версия %d не поддерживается", ErrUnsupportedVersion, version) } if err := binary.Read(r, binary.LittleEndian, &img.Algorithm); err != nil { return nil, fmt.Errorf("ошибка чтения algorithm: %w", err) } if img.Algorithm < AlgorithmRLE || img.Algorithm > AlgorithmFractal { return nil, fmt.Errorf("%w: алгоритм %d", ErrUnsupportedAlgorithm, img.Algorithm) } if err := binary.Read(r, binary.LittleEndian, &img.Width); err != nil { return nil, fmt.Errorf("ошибка чтения width: %w", err) } if err := binary.Read(r, binary.LittleEndian, &img.Height); err != nil { return nil, fmt.Errorf("ошибка чтения height: %w", err) } if err := binary.Read(r, binary.LittleEndian, &img.DataSize); err != nil { return nil, fmt.Errorf("ошибка чтения data size: %w", err) } if img.DataSize == 0 { return nil, fmt.Errorf("%w: размер данных равен нулю", ErrCorruptedData) } if img.DataSize > 100*1024*1024 { return nil, fmt.Errorf("%w: размер данных слишком большой: %d байт", ErrCorruptedData, img.DataSize) } if err := binary.Read(r, binary.LittleEndian, &img.FileHeader); err != nil { return nil, fmt.Errorf("ошибка чтения file header: %w", err) } var rawHeaderSize uint32 if err := binary.Read(r, binary.LittleEndian, &rawHeaderSize); err != nil { return nil, fmt.Errorf("ошибка чтения raw header size: %w", err) } img.RawHeader = make([]byte, rawHeaderSize) if _, err := io.ReadFull(r, img.RawHeader); err != nil { return nil, fmt.Errorf("ошибка чтения raw header: %w", err) } var extraDataSize uint32 if err := binary.Read(r, binary.LittleEndian, &extraDataSize); err != nil { return nil, fmt.Errorf("ошибка чтения extra data size: %w", err) } if extraDataSize > 0 { img.ExtraData = make([]byte, extraDataSize) if _, err := io.ReadFull(r, img.ExtraData); err != nil { return nil, fmt.Errorf("ошибка чтения extra data: %w", err) } } img.Data = make([]byte, img.DataSize) read, err := io.ReadFull(r, img.Data) if err != nil { return nil, fmt.Errorf("ошибка чтения данных: %w", err) } if read != int(img.DataSize) { return nil, fmt.Errorf("%w: прочитано %d байт из %d", ErrCorruptedData, read, img.DataSize) } return img, nil } // читает сжатое изображение из файла func DecodeFromFile(filename string) (*CompressedImage, error) { file, err := os.Open(filename) if err != nil { return nil, fmt.Errorf("не удалось открыть файл: %w", err) } defer file.Close() return Decode(file) }