如何在C中从上到下写入文件

时间:2018-06-20 08:48:41

标签: c image-processing flip

我想问一下是否有可能从上到下写入文件?    下面的当前代码将垂直翻转并成像。    这使用从左到右的方式写入文件。

另一方面,如果在写入文件时遵循从左到右的模式,我将如何水平翻转图像出现问题。 注意:这里我还有其他选择,那就是从上到下交换行。

谁知道也许有一种方法可以遵循“垂直翻转”模式。

我很感谢你们能提供的任何帮助。谢谢。

 //Flip Vertically
for(y = WIDTH-1 ; y >= 0 ; y--) {
    for(x = 0 ; x < HEIGHT; x++) {

        p = (unsigned char *)datap + ((WIDTH) * y * 3) + (x * 3); 
        // output pixel
        if(fwrite(p, sizeof(char), 3, outfp) != 3) {
            cleanUpBeforeExit(infp, outfp, datap, E_FILE_WRITE_ERROR);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

请注意,您使用的术语非常含糊。垂直翻转,水平翻转可以用两种方式来理解,就像说文件时从上到下一样。

因此,我会给出一个普遍的答案。

假设您以通常的扫描顺序写入像素,首先是第一行,左边是像素,即在双循环中寻址Image[Column + Row * Pitch]Row外部,Column内部)。您还可以反转循环遍历的顺序。

然后,您将通过写入Image[(Width - 1 - Column) + Row * Pitch]获得左右镜像(像素水平移动),并通过Image[Column + (Height - 1 - Row) * Pitch]获得上下镜像(像素垂直移动)。

您可以将这两种修改组合在一起以实现180°旋转。

答案 1 :(得分:0)

在写入文件时,通常会将数据从文件开始写入文件结束。在大多数情况下,以任何其他顺序编写将使您的程序更加复杂并降低性能。

因此,您需要根据要翻转数据的方式以正确的顺序访问数据。

类似的东西:

#include <stdio.h>

#define WIDTH 2
#define HEIGHT 3

void print_element(char* p)
{
  // Here I just print to stdout but you can just save it to a file
  printf("%c %c %c ", *p, *(p+1), *(p+2));
}

int main()
{
  char data[3 * HEIGHT][3 * WIDTH] = {{'a', 'b', 'c', 'd', 'e', 'f'},
                                       {'g', 'h', 'i', 'j', 'k', 'l'},
                                       {'m', 'n', 'o', 'p', 'q', 'r'}};

  char* datap = (char*)data;
  char* p;

  printf("Normal\n");
  for(int y = 0; y < HEIGHT; y++)
  {
    for(int x = 0 ; x < WIDTH; x++)
    {
        p = datap + ((WIDTH) * y * 3) + (x * 3);
        print_element(p);
    }
    printf("\n");
  }

  printf("\nFlip horizontal\n");
  for(int y = HEIGHT-1 ; y >= 0 ; y--)
  {
    for(int x = 0 ; x < WIDTH; x++)
    {
      p = datap + ((WIDTH) * y * 3) + (x * 3);
      print_element(p);
    }
    printf("\n");
  }

  printf("\nFlip vertical\n");
  for(int y = 0; y < HEIGHT; y++)
  {
    for(int x =WIDTH-1; x >= 0; x--)
    {
      p = datap + ((WIDTH) * y * 3) + (x * 3);
      print_element(p);
    }
    printf("\n");
  }

  printf("\nFlip both\n");
  for(int y = HEIGHT-1 ; y >= 0 ; y--)
  {
    for(int x = WIDTH-1; x >= 0; x--)
    {
      p = datap + ((WIDTH) * y * 3) + (x * 3);
      print_element(p);
    }
    printf("\n");
  }

  return 0;
}

这将产生:

Normal
a b c d e f
g h i j k l
m n o p q r

Flip horizontal
m n o p q r
g h i j k l
a b c d e f

Flip vertical
d e f a b c
j k l g h i
p q r m n o

Flip both
p q r m n o
j k l g h i
d e f a b c