图像的平移变换之c++实现(qt + 不调包)

1.基本原理

    设dx为水平偏移量,dy为垂直偏移量,则平移变换的坐标映射关系为下公式,图像平移一般有两种方式。

    1.不改变图像大小的平移(一旦平移,相应内容被截掉)

    1)当dx >= width、dx <= -width、dy >= height或dy <= -height时候,此时图像完全移出画布范围,可以不处理

    2)当dx < 0 时候,左侧部分图像将被截取

    3)当dx > 0 时候,右侧部分图像将被截取

    2.改变图像大小的平移(一旦平移,图像会变大)

 

2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解

/*平移变化函数(不改变图像大小) xx为平移变换的水平偏移量 yy为平移的垂直偏移量*/
QImage* MainWindow::MoveTransNormal(QImage* image , int xx, int yy)
{
    QImage* newImage = new QImage(image->width(), image->height(), QImage::Format_ARGB32);
    if (xx >= image->width() || yy >= image->height() || xx <= -image->width() || yy <= -image->height())
        return image;

    int y = 0;
    unsigned char* copyPixel = NULL;
    unsigned char* objPixel = NULL;
    int copyWidth = image->width() - abs(xx);

    for (int j = 0; j < image->height(); j++)
    {
        copyPixel = image->bits() + j * image->width() * 4;
        if (xx < 0)
            copyPixel += abs(xx) * 4;

        y = j + yy;

        if(y >=0 && y < image->height())
        {
            objPixel  = newImage->bits() + y *image->width() * 4;
            if (xx > 0)
                objPixel += abs(xx) * 4;

            memcpy(objPixel,copyPixel,copyWidth * 4);
        }
    }
    return newImage;
}


/* 平移变换(改变图像大小) xx为平移变换的水平偏移量 yy为平移的垂直偏移量*/
QImage* MainWindow::MoveTransSize(QImage* image, int xx, int yy)
{
    unsigned int  outWidth = image->width() + abs(xx);
    unsigned int  outHeight = image->height() + abs(yy);
    QImage* newImage = new QImage(outWidth, outHeight , QImage::Format_ARGB32);
    int x = 0;
    int y = 0;
    unsigned char* copyPixel = NULL;
    unsigned char* objPixel = NULL;

    if (xx > 0)
        x = xx;
    if (yy > 0)
        y = yy;

    for (int j = 0; j < image->height(); j++)
    {
        copyPixel = image->bits() + j * image->width() * 4;
        objPixel = newImage->bits() + y * outWidth * 4 + x * 4;
        y ++;

        memcpy(objPixel, copyPixel, image->width() * 4);

    }
    return newImage;
}

3.参考资料

    数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

你可能感兴趣的:(c++基本图像处理算法)