resize 放大2陪 neon ARM
时间: 2024-01-23 14:14:23 浏览: 257
根据提供的引用内容,以下是一个关于在ARM上使用neon进行resize放大的示例:
```c
#include <arm_neon.h>
void resize_neon(unsigned char* src, unsigned char* dst, int src_width, int src_height, int dst_width, int dst_height) {
int src_stride = src_width * 4;
int dst_stride = dst_width * 4;
float scale_x = (float)src_width / dst_width;
float scale_y = (float)src_height / dst_height;
for (int y = 0; y < dst_height; y++) {
for (int x = 0; x < dst_width; x += 8) {
float x_src = x * scale_x;
float y_src = y * scale_y;
int x0 = (int)x_src;
int y0 = (int)y_src;
float dx = x_src - x0;
float dy = y_src - y0;
uint8x8_t p00 = vld1_u8(src + y0 * src_stride + x0 * 4); uint8x8_t p01 = vld1_u8(src + y0 * src_stride + (x0 + 1) * 4);
uint8x8_t p10 = vld1_u8(src + (y0 + 1) * src_stride + x0 * 4);
uint8x8_t p11 = vld1_u8(src + (y0 + 1) * src_stride + (x0 + 1) * 4);
uint8x8_t p0 = vadd_u8(p00, vmul_u8(vsub_u8(p01, p00), vdup_n_u8(dx * 255)));
uint8x8_t p1 = vadd_u8(p10, vmul_u8(vsub_u8(p11, p10), vdup_n_u8(dx * 255)));
uint8x8_t p = vadd_u8(p0, vmul_u8(vsub_u8(p1, p0), vdup_n_u8(dy * 255)));
vst1_u8(dst + y * dst_stride + x * 4, p);
}
}
}
```
这是一个使用NEON指令集在ARM上进行resize放大的函数。它使用了ARM NEON的向量指令来加速计算。函数接受源图像和目标图像的指针,以及宽度和高度参数。它将源图像的像素值根据放大比例进行插值计算,并将结果存储在目标图像中。
阅读全文