ResizeCubic
用于调整图像大小,使用双参数三次插值算法,属于图像几何变换的一类功能。
在调用ResizeCubic函数之前需要先调用Init函数进行初始化,然后调用ResizeCubic主功能函数,最后调用Release函数释放相关空间。
函数接口声明如下:
- 初始化函数:
HmppResult HMPPI_ResizeCubicInit_32f(HmppiSize srcSize, HmppiSize dstSize, float B, float C, HmppiResizePolicy_32f** pSpec);
- 主函数:
HmppResult HMPPI_ResizeCubic_32f_C1R(const float* pSrc, int32_t srcStep, float* pDst, int32_t dstStep, HmppiPoint dstOffset, HmppiSize dstSize, HmppiBorderType border, const float* pBorderValue, const HmppiResizePolicy_32f* pSpec);
- 释放函数:
HmppResult HMPPI_ResizeCubicRelease_32f(HmppiResizePolicy_32f *policy);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
pSrc |
指向源图像感兴趣区域的指针。 |
非空 |
输入 |
srcStep |
源图像中连续行起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
srcSize |
源图像块的大小。 |
正整数 |
输入 |
pDst |
指向目标图像感兴趣区域的指针。 |
非空 |
输入/输出 |
dstStep |
目标图像中连续行的起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
dstOffset |
目标图像块的偏移值。 |
非负整数 |
输入 |
dstSize |
目标图像块的大小。 |
正整数 |
输入 |
B |
三次滤波器的第一个参数。 |
实数 |
输入 |
C |
三次滤波器的第二个参数。 |
实数 |
输入 |
border |
边界取值算法。 |
目前支持如下算法: HMPPI_BORDER_REPL HMPPI_BORDER_MIRROR HMPPI_BORDER_MIRROR_R |
输入 |
borderValue |
边界值。 |
border为HMPPI_BORDER_CONST时边界值 |
输入 |
pSpec |
特殊结构体的指针。 |
非空 |
输入/输出 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
|---|---|
HMPP_STS_NO_OPERATION |
告警,不进行操作。srcSize和dstSize中width、height存在零。 |
HMPP_STS_NULL_PTR_ERR |
传入的任意一个指针存在空指针。 |
HMPP_STS_MALLOC_FAILED |
Policy初始化时内存申请失败。 |
HMPP_STS_SIZE_ERR |
srcSize和dstSize中width、height存在负值。 或srcSize小于2x2。 |
HMPP_STS_BORDER_ERR |
边界算法类型不支持。 |
HMPP_STS_STEP_ERR |
|
HMPP_STS_OUT_OF_RANGE_ERR |
目标图像块偏移值比Init函数输入的目标图像块的width/height大。 |
HMPP_STS_SIZE_WRN |
目标图像块width/height比Init函数输入的目标图像块的width/height大。 |
示例
void ResizeCubicExample()
{
HmppiSize srcSize = {4, 4};
HmppiSize dstSize = {6, 6};
HmppiPoint dstOffset = {0, 0};
int srcStep = srcSize.width * sizeof(float);
int dstStep = dstSize.width * sizeof(float);
HmppiResizePolicy_32f *pSpec;
float pSrc[] = {0.0, 255.0, 3.0, 6.0, 255.0, 0.0, 2.0, 1.0, 3.0,
0.0, 255.0, 3.0, 6.0, 255.0, 0.0, 2.0};
int dstLen = dstSize.width * dstSize.height;
float *pDst = HMPPS_Malloc_32f(dstLen);
double B = 0.5;
double C = 0.5;
HmppResult result = HMPPI_ResizeCubicInit_32f(srcSize, dstSize, B, C, &pSpec);
HmppiBorderType border = HMPPI_BORDER_REPL;
float borderValue = pSrc[0];
result = HMPPI_ResizeCubic_32f_C1R(pSrc, srcStep, pDst, dstStep, dstOffset, dstSize, border, &borderValue, pSpec);
printf("result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
for (int i = 0; i < dstLen; i++){
printf("%f ", pDst[i]);
}
printf("\n");
HMPPI_ResizeCubicRelease_32f(pSpec);
}
运行结果:
result = 0 -4.966425 140.752594 205.351364 60.469444 -8.723660 6.077533 140.751587 141.259216 97.576118 18.680174 -10.837348 3.531568 205.383133 95.673416 7.140303 43.515594 33.608219 0.835248 60.508411 16.424671 41.026234 159.661621 113.710358 0.589375 -9.937934 58.751194 133.184296 140.705246 72.326935 1.272445 3.603872 145.281662 204.080536 56.064888 -13.772015 2.033274