我正在尝试使用
h5py
重新创建 HDF5 文件,该文件将二进制数据(例如 JPEG 压缩图像)存储为 OPAQUE
数据集,使用标签存储 MIME 类型,以便以后可以轻松解码。
我能够解决这个问题的唯一方法是使用低级 API,但如果有更高级别的 API 那就太好了!
(我将我的解决方案发布为答案,希望对其他人有用,因为我很难找到很多做此类事情的例子)
解决此问题并避免使用低级 API 的更简单方法可能是HDFql。在Python中使用HDFql,可以如下解决:
# import HDFql package
import HDFql
# create HDF5 file 'output.h5'
HDFql.execute("CREATE FILE output.h5")
# create dataset 'mydata' (in file 'output.h5') of data type opaque with a tag 'image/jpeg' and storing the content of file 'input.jpeg'
HDFql.execute("CREATE DATASET output.h5 mydata TAG image/jpeg VALUES FROM BINARY FILE input.jpeg")
我发现执行此操作的唯一方法是使用低级 API。这意味着我们需要自己设置数据类型和数据空间,然后才能创建数据集和写入数据。
import h5py
import numpy as np
# get the binary data in
with open('input.jpeg', 'rb') as fd:
data = fd.read()
# set up an HDF5 type appropriately sized for our data
dtype = h5py.h5t.create(h5py.h5t.OPAQUE, len(data))
dtype.set_tag(b'image/jpeg')
# set up a simple scalar HDF5 data space
space = h5py.h5s.create(h5py.h5s.SCALAR)
with h5py.File('output.h5', 'w') as root:
ds = h5py.h5d.create(root.id, b'mydata', dtype, space)
ds.write(space, space, np.frombuffer(data, dtype=np.uint8), dtype)
这对我有用,
h5dump -H output.h5
给予:
HDF5 "output.h5" {
GROUP "/" {
DATASET "mydata" {
DATATYPE H5T_OPAQUE {
OPAQUE_TAG "image/jpeg";
}
DATASPACE SCALAR
}
}
}
但是如果这更容易一点那就太好了!