--- 内部辅助函数 (保持不变) ---
(mat: &Mat)
| 123 | |
| 124 | // --- 内部辅助函数 (保持不变) --- |
| 125 | fn mat_to_u32_buffer(mat: &Mat) -> Result<Vec<u32>> { |
| 126 | let pixel_count = (mat.rows * mat.cols) as usize; |
| 127 | // 提前分配并初始化,避免 debug 模式下的 capacity/push 检查开销 |
| 128 | let mut buffer = vec![0u32; pixel_count]; |
| 129 | |
| 130 | // 使用 chunks_exact 配合 zip,编译器会自动进行 SIMD 展开和去边界检查 |
| 131 | for (src_chunk, dst_pixel) in mat.data.chunks_exact(3).zip(buffer.iter_mut()) { |
| 132 | let b = src_chunk[0] as u32; |
| 133 | let g = src_chunk[1] as u32; |
| 134 | let r = src_chunk[2] as u32; |
| 135 | |
| 136 | // Pack: 00 | R | G | B |
| 137 | *dst_pixel = (r << 16) | (g << 8) | b; |
| 138 | } |
| 139 | |
| 140 | Ok(buffer) |
| 141 | } |