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#] 简单的俄罗斯方块实现](https://img-blog.csdnimg.cn/7352d9c5ae3f4f9f8f1bea49a719dae4.png)


