【问题标题】:vertical flip bitmap in C doesn't workC中的垂直翻转位图不起作用
【发布时间】:2018-12-23 11:30:57
【问题描述】:

我在处理这段代码时遇到了问题。尝试使用此方法垂直翻转 24 位未压缩 bmp 文件,但出现分段错误。我已经检查了逻辑,这似乎是正确的。我有什么问题?

int verticalflip (PIXEL *original, PIXEL **new, int rows, int cols) {

    int row, col;

    if ((rows <= 0) || (cols <= 0)) return -1;

    *new = (PIXEL*)malloc(rows*cols*sizeof(PIXEL));

    for (row=0; row < rows; row++)
        for (col=0; col < cols; col++) {
            PIXEL* o = original + row*cols + col;
            PIXEL* n = (*new) + (rows-1-row)*cols + col;
            *n = *o;
        }

    return 0;
}

【问题讨论】:

  • 你在函数调用中作为new传递了什么?
  • 应该是这样的:PIXEL* flipped; verticalflip(..., &amp;flipped, ...);
  • 将 PIXEL *bitmap、*newBitmap 分别传递给 original 和 new。我有另一种水平翻转的方法,它本质上是相同的,但当然逻辑不同,而且效果很好。我认为问题可能不在于函数的逻辑,而在于其他地方。我正在检查我的整个代码。
  • 你的意思是PIXEL **newBitmap?
  • 我的函数调用:verticalflip(bmp, &newBmp, rows, columns);

标签: c bitmap variable-assignment flip


【解决方案1】:

鉴于您正在尝试创建位图矩阵,

*new = (PIXEL*)malloc(rows*cols*sizeof(PIXEL));

不会正确分配内存。

代码应该是:

new = malloc(rows*sizeof(PIXEL*));
for(int i=0 ; i<rows ; i++)
    new[i] = (PIXEL*)malloc(cols*sizeof(PIXEL));

rowscols 可以根据您的其余逻辑进行切换。

【讨论】:

  • 不正确。图像中的位图是连续内存,而不是指向像素的指针数组
  • 可能是这样,但是用来表示位图的数据结构无关紧要。我已经使用矩阵访问和操作位图,没有任何问题。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多