ioutil ReadFile добавляет дополнительные байты - PullRequest
0 голосов
/ 09 сентября 2018

Я пытался нарисовать часть базы данных MNIST в файл изображения, в моих первых попытках сгенерированное изображение выглядело смещенным, как показано ниже:

enter image description here

Я знаю, что обучающий файл состоит из 60 000 изображений, каждое размером 28 x 28 пикселей, которые в файле представлены в виде массива 28 x 28 x 60 000 uint8, что должно дать 47040000 в качестве его длины.

Тем не менее, при печати длины файла он дает 47040016 в качестве длины, что дополнительные 16 цифр являются причиной смещения изображения.

Используется следующий код: const imgNum определяется изображением, которое я хочу напечатать, и длиной изображения. Я не вижу ничего странного, когда читаю файл изображений.

package main

import (
    "image"
    "image/color"
    "image/png"

    "io/ioutil"

    "os"
)

const (
    imgSideLength = 28
    imgSize = imgSideLength * imgSideLength
    imgNum = 499 * imgSize
)

var images []uint8

func main() {
    images, err := ioutil.ReadFile("train-images")
    check(err)

    canvas := image.NewRGBA(image.Rect(0, 0, imgSideLength, imgSideLength))

    pixelIndex := imgNum
    for i := 0; i < imgSideLength; i++ {
        for j := 0; j < imgSideLength; j++ {
            currPixel := images[pixelIndex]
            pixelIndex++

            pixelColor := color.RGBA{currPixel, currPixel, currPixel, 255}
            canvas.Set(j, i, pixelColor)
        }   
    }

    numFile, err := os.Create("number.png")
    check(err)
    defer numFile.Close()

    png.Encode(numFile, canvas)
}

func check(e error) {
    if e != nil {
        panic(e)
    }
}

Зная, что именно эти 16 пикселей вызывают сдвиг изображения, я решил изменить imgNum:

imgNum = 499 * imgSize + 16

С этим изменением изображение прорисовывается нормально.

enter image description here

Но я все еще хотел бы знать, почему есть дополнительные 16 номеров, которых не должно быть?

1 Ответ

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

Глядя на их веб-сайт , вы видите, что формат данных для файла:

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

, что означает, что первые 16 байтов представляют собой 4 32-битных целых числа, следовательно, 16 байтов информации заголовка.

...