// Convert raw image data into a 2d array of 64-bit labels func (d *Data) convertTo64bit(geom dvid.Geometry, data []uint8, bytesPerVoxel, stride int) ([]byte, error) { nx := int(geom.Size().Value(0)) ny := int(geom.Size().Value(1)) numBytes := nx * ny * 8 data64 := make([]byte, numBytes, numBytes) var byteOrder binary.ByteOrder if geom.DataShape().ShapeDimensions() == 2 { byteOrder = binary.BigEndian // This is the default for PNG } else { byteOrder = binary.LittleEndian } switch bytesPerVoxel { case 1: dstI := 0 for y := 0; y < ny; y++ { srcI := y * stride for x := 0; x < nx; x++ { binary.LittleEndian.PutUint64(data64[dstI:dstI+8], uint64(data[srcI])) srcI++ dstI += 8 } } case 2: dstI := 0 for y := 0; y < ny; y++ { srcI := y * stride for x := 0; x < nx; x++ { value := byteOrder.Uint16(data[srcI : srcI+2]) binary.LittleEndian.PutUint64(data64[dstI:dstI+8], uint64(value)) srcI += 2 dstI += 8 } } case 4: dstI := 0 for y := 0; y < ny; y++ { srcI := y * stride for x := 0; x < nx; x++ { value := byteOrder.Uint32(data[srcI : srcI+4]) binary.LittleEndian.PutUint64(data64[dstI:dstI+8], uint64(value)) srcI += 4 dstI += 8 } } case 8: dstI := 0 for y := 0; y < ny; y++ { srcI := y * stride for x := 0; x < nx; x++ { value := byteOrder.Uint64(data[srcI : srcI+8]) binary.LittleEndian.PutUint64(data64[dstI:dstI+8], uint64(value)) srcI += 8 dstI += 8 } } default: return nil, fmt.Errorf("could not convert to 64-bit label given %d bytes/voxel", bytesPerVoxel) } return data64, nil }