垂直翻转位图图像(一维数组)

时间:2017-07-09 18:54:00

标签: c algorithm

我有一个倒置的一维数组(BitMap [i])。如何在C中垂直翻转?

这段代码水平翻转,但我需要垂直翻转它(x轴):

  for(int row = 0; row < image_height; ++row) {
      for(int column = 0; column < image_width; ++column) {
          flipped_BitMap[row*image_width + column] = BitMap[row*image_width + (image_width-1 - column)];
      }
  }

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您正在原位更改图像,则需要将顶行中的元素与底行中的元素交换,将第二行与第二行底行交换,等等。

由于您没有进行原位翻转但正在制作副本,因此您需要将原始图像的顶行复制到翻转图像的底行,将原始图像的第二行复制到第二行。翻转图像的底行。将标识符减少到可管理的长度,以便在不滚动页面的RHS的情况下读取单行代码:

int ht = image_height;
int wd = image_width;
for (int row = 0; row < ht; ++row)
{
     for (int col = 0; col < wd; ++col)
     {
          flipped_BitMap[(ht - row - 1) * wd + col] = BitMap[row * wd + col];
     }
}

您可以强制使用数组索引中(ht - row - 1) * wdrow * wd项的变量。但是,将这些循环不变表达式移出循环是任何优化器的基本步骤,因此明确地执行此操作不太可能是至关重要的。在某些情况下,类似的“优化”甚至可能适得其反。

int ht = image_height;
int wd = image_width;
for (int row = 0; row < ht; ++row)
{
     int tgt_off = (ht - row - 1) * wd;   // Start of target row
     int src_off = row * wd;              // Start of source row
     for (int col = 0; col < wd; ++col)
     {
          flipped_BitMap[tgt_off + col] = BitMap[src_off + col];
     }
}

您可以反转源行和目标行的表达式,虽然您处理的数据略有不同,但最终结果将是相同的。

概念证明

这是一个测试程序,用来让我满意,代码应该按预期运行。请注意,变量已被无情地重命名,但水平翻转代码在问题中被删除,而垂直翻转代码则从答案的前一部分中删除。

#include <stdio.h>

static void dump_bitmap(const char *tag, int rows, int cols, int bitmap[])
{
    printf("%s (%dx%d):\n", tag, rows, cols);
    for (int r = 0; r < rows; r++)
    {
        for (int c = 0; c < cols; c++)
            printf(" %.2X", bitmap[r * cols + c]);
        putchar('\n');
    }
}

int main(void)
{
    enum { ROWS = 8, COLS = 6 };
    // random -n 48 0 255 | commalist -b '        ' -n 6 -W 4
    int source[ROWS * COLS] =
    {
        134,  185,  171,  136,  117,  219,
        115,  133,  102,   51,  146,   86,
        210,  138,  195,   30,  202,  106,
        161,  157,  199,  152,  179,  120,
        113,   76,   73,  119,   40,  248,
        243,  177,   72,   45,  226,  220,
        101,  121,  206,  168,  156,  148,
        106,    1,  248,   61,   60,  211,
    };
    int h_flip[ROWS * COLS];
    int v_flip[ROWS * COLS];

    dump_bitmap("Original", ROWS, COLS, source);
    for (int row = 0; row < ROWS; ++row)
    {
        for (int col = 0; col < COLS; ++col)
        {
            h_flip[row * COLS + col] = source[row * COLS + (COLS - 1 - col)];
        }
    }
    dump_bitmap("H-Flip", ROWS, COLS, h_flip);

    for (int row = 0; row < ROWS; ++row)
    {
        for (int col = 0; col < COLS; ++col)
        {
            v_flip[(ROWS - row - 1) * COLS + col] = source[row * COLS + col];
        }
    }
    dump_bitmap("V-Flip", ROWS, COLS, v_flip);

    return 0;
}

示例输出

Original (8x6):
 86 B9 AB 88 75 DB
 73 85 66 33 92 56
 D2 8A C3 1E CA 6A
 A1 9D C7 98 B3 78
 71 4C 49 77 28 F8
 F3 B1 48 2D E2 DC
 65 79 CE A8 9C 94
 6A 01 F8 3D 3C D3
H-Flip (8x6):
 DB 75 88 AB B9 86
 56 92 33 66 85 73
 6A CA 1E C3 8A D2
 78 B3 98 C7 9D A1
 F8 28 77 49 4C 71
 DC E2 2D 48 B1 F3
 94 9C A8 CE 79 65
 D3 3C 3D F8 01 6A
V-Flip (8x6):
 6A 01 F8 3D 3C D3
 65 79 CE A8 9C 94
 F3 B1 48 2D E2 DC
 71 4C 49 77 28 F8
 A1 9D C7 98 B3 78
 D2 8A C3 1E CA 6A
 73 85 66 33 92 56
 86 B9 AB 88 75 DB

如果看到垂直翻转的图像时出现问题,那么我建议问题是在代码的转录中或者在垂直翻转代码范围之外的其他地方,至少在有更多信息可用于诊断什么之前出了问题。