ioutil ReadFile增加了额外的字节

时间:2018-09-09 19:27:27

标签: file go mnist

我一直在尝试将许多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 :(得分:2)

查看their web site,您可以看到文件的数据格式为:

[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个字节的标头信息。