我有一个很大的Vec<u8>
,代表一个灰色图像的原始像素值.因为像素格式实际上是16位宽,所以两个u8
就是一个像素.
现在我想使用图像as if,它是8位宽的,所以我只取像素中较高的8位部分.
作为一个例子,给定一个原始vec v = vec![0,1,2,3,4,5]
,我如何通过步骤2
将其查看到引用view : &[u8]
(而不需要将它们复制到新的Vec中,以获得性能),使得view
可以等效于&[0,2,4]
.非常感谢
我有一个很大的Vec<u8>
,代表一个灰色图像的原始像素值.因为像素格式实际上是16位宽,所以两个u8
就是一个像素.
现在我想使用图像as if,它是8位宽的,所以我只取像素中较高的8位部分.
作为一个例子,给定一个原始vec v = vec![0,1,2,3,4,5]
,我如何通过步骤2
将其查看到引用view : &[u8]
(而不需要将它们复制到新的Vec中,以获得性能),使得view
可以等效于&[0,2,4]
.非常感谢
您所要求的东西是不可能的,因为根据定义,存储片是连续的内存块.要得到一个&[0u8, 2, 4]
,你需要有一个等于[0u8, 2, 4]
的东西,也就是说,这三个字节正好紧挨着彼此定位.
你的conceptually要求的东西看起来像stride,也就是说,它会产生一系列元素,但会跳过其中的一些元素.这可以使用迭代器相对容易地完成,例如,like this:
fn only_first_byte_from_pair<'a>(data: &'a [u8]) -> impl Iterator<Item = u8> + 'a {
return data.chunks(2).map(|chunk| chunk[0])
}
或者,您可以查看ndarray
,它具有开箱即用的相关功能,但对于实际任务来说可能有点太复杂了.