通用的图像模板操作函数

    技术2022-05-11  128

     需要只想图像象素的指针以及图像的高宽信息,变换模板的信息,包括模板到小信息,模板稀疏,模板元素数组和模板中心元素的位置信息。

    /************************************************************************* * 函数名称: *   Template() * 参数: *   LPSTR lpDIBBits    - 指向源DIB图像指针 *   LONG  lWidth       - 源图像宽度(象素数) *   LONG  lHeight      - 源图像高度(象素数) *   int   iTempH  - 模板的高度 *   int   iTempW  - 模板的宽度 *   int   iTempMX  - 模板的中心元素X坐标 ( < iTempW - 1) *   int   iTempMY  - 模板的中心元素Y坐标 ( < iTempH - 1) *  FLOAT * fpArray - 指向模板数组的指针 *  FLOAT fCoef  - 模板系数 * 返回值: *   BOOL               - 成功返回TRUE,否则返回FALSE。 * 说明: *   该函数用指定的模板(任意大小)来对图像进行操作,参数iTempH指定模板 * 的高度,参数iTempW指定模板的宽度,参数iTempMX和iTempMY指定模板的中心 * 元素坐标,参数fpArray指定模板元素,fCoef指定系数。 ************************************************************************/

    BOOL Bmp::Template(u8_t **lpDIBBits, LONG lWidth, LONG lHeight, int iTempH, int iTempW, int iTempMX, int iTempMY, FLOAT * fpArray, FLOAT fCoef){  u8_t **lpNewDIBBits;  // 指向复制图像的指针 u8_t* lpSrc;          // 指向源图像的指针  u8_t* lpDst;          // 指向要复制区域的指针  LONG i,j,k,l;   // 循环变量  FLOAT fResult;   // 计算结果   u32_t lLineBytes;   // 图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8);

     // 暂时分配内存,以保存新图像    lpNewDIBBits = (u8_t **)malloc((u32_t)lLineBytes*lHeight*10);

     // 初始化图像为原始图像 memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight);   for(i = iTempMY; i < lHeight - iTempH + iTempMY + 1; i++) // 行(除去边缘几行) {    for(j = iTempMX; j < lWidth - iTempW + iTempMX + 1; j++)// 列(除去边缘几列)  {   // 指向新DIB第i行,第j个象素的指针   lpDst = (u8_t *)lpNewDIBBits + lLineBytes * (lHeight - 1 - i) + j;      fResult = 0;

       for (k = 0; k < iTempH; k++)   {    for (l = 0; l < iTempW; l++)    {     // 指向DIB第i - iTempMY + k行,第j - iTempMX + l个象素的指针     lpSrc = (u8_t *)lpDIBBits + lLineBytes * (lHeight - 1       - i + iTempMY - k) + j - iTempMX + l;          // 保存象素值     fResult += (* lpSrc) * fpArray[k * iTempW + l];    }   }         fResult *= fCoef;     // 乘上系数      fResult = (FLOAT ) fabs(fResult); // 取绝对值   if(fResult > 255)   {    * lpDst = 255;   }   else   {    * lpDst = (unsigned char) (fResult + 0.5);   }     } }  // 复制变换后的图像 memcpy(lpDIBBits, lpNewDIBBits, lLineBytes * lHeight);

        free(lpNewDIBBits);  return TRUE;}

     


    最新回复(0)