c - 在c中水平翻转图像

标签 c image swap

我的功能是获取图像,我正在尝试显示它的镜像。 水平翻转。我尝试执行类似交换功能的操作,但它会打印原始图片。

图像的大小是m*n,函数知道m和n的值。

这是我的代码:

void flipfunc(Img *img)
{
    int y;
    int x;
    const int middleX = m / 2;
    char tmp;
    char* p;

    for (x = 0; x < middleX; ++x)
    {
        p = image->data + x * m;
        for (y = 0; y <3*n; y+=3)
        {
            // swap pixels
            tmp = p[y];
            p[y] = p[3*n - 1 - y];
            p[3*n - 1 - y] = tmp;
            tmp = p[y+1];
            p[y+1] = p[3*n - 1 - (y+1)];
            p[3*n - 1 - y] = tmp;
            tmp = p[y+2];
            p[y+2] = p[3*n - 1 - (y+2)];
            p[3*n - 1 - (y+2)] = tmp;
        }
    }
}

/* 图像类型——包含高度、宽度和RGB数据*/

struct Img {
    unsigned long X;
    unsigned long Y;
    char *data;
};

最佳答案

抛开其他人在评论中提到的问题,我会尝试用一些提示来回答:

1) 在您的函数中,您想对给定的 rgb 图像进行就地镜像。这是合理的。

2) 您的“middleX”和像素交换方法的思考方向是正确的。但看起来你做错了:你完全忽略了图像的上半部分,而是将下半部分的每一行交换两次!这就是为什么您最终会得到相同图像的原因。那么为什么不将“中间”逻辑应用到内部循环而不是外部循环呢?

关于c - 在c中水平翻转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34665394/

相关文章:

html - Javascript/php 轮播无法正常工作

c++ - 单链表交换函数(int, int)

c - 递减前缀作为 c while 循环中的条件

c - 如何将 C 编译器安装到 Eclipse?

c++ - 在 C++ 中隐藏黑色窗口

c - 我需要将 Windows 中的文件路径从 c :\abc\efg\mmm. txt 转换为 c :\\abc\\mm. txt?

r - 使用 RColorBrewer 将颜色集中在 0 附近

javascript - 将字节转换为图像以在 HTML5 Canvas 上绘制

c++ - 对自定义元素 vector 进行排序时的意外(至少对我而言)行为

c++ - 交换单个链表上的节点