如何在C中从上到下写入文件
How to write on a file from Top to Bottom in C
请问是否可以从上到下写一个文件?
下面的当前代码将垂直翻转和成像。
这使用从左到右写入文件。
另一方面,如果我在写入文件时遵循从左到右的模式,我会遇到如何水平翻转图像的问题。
注意:我这里还有其他选项,就是从上到下换行。
谁知道也许有一种方法可以遵循垂直翻转模式。
如果你们能提供任何帮助,我将不胜感激。谢谢。
//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);
}
}
}
请注意,您使用的术语非常含糊。垂直翻转,水平翻转可以理解为两种方式,当说到文件时可以理解为从上到下。
所以我会给出一个笼统的答案。
假设您按照通常的扫描顺序写入像素,顶行在前,左像素在前,即通过在双循环中寻址 Image[Column + Row * Pitch]
(外部在 Row
,内部在 Column
).您也可以反转循环遍历顺序。
那么写Image[(Width - 1 - Column) + Row * Pitch]
就得到左右镜像(像素水平移动),写Image[Column + (Height - 1 - Row) * Pitch]
就得到上下镜像(像素垂直移动)。
你可以结合这两个修改来实现180°旋转。
写入文件时,通常会从文件开头向文件结尾写入数据。在大多数情况下,以任何其他顺序编写都会使您的程序更复杂并且性能更差。
所以您需要的是根据您想要翻转数据的方式以正确的顺序访问您的数据。
类似于:
#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
请问是否可以从上到下写一个文件? 下面的当前代码将垂直翻转和成像。 这使用从左到右写入文件。
另一方面,如果我在写入文件时遵循从左到右的模式,我会遇到如何水平翻转图像的问题。 注意:我这里还有其他选项,就是从上到下换行。
谁知道也许有一种方法可以遵循垂直翻转模式。
如果你们能提供任何帮助,我将不胜感激。谢谢。
//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);
}
}
}
请注意,您使用的术语非常含糊。垂直翻转,水平翻转可以理解为两种方式,当说到文件时可以理解为从上到下。
所以我会给出一个笼统的答案。
假设您按照通常的扫描顺序写入像素,顶行在前,左像素在前,即通过在双循环中寻址 Image[Column + Row * Pitch]
(外部在 Row
,内部在 Column
).您也可以反转循环遍历顺序。
那么写Image[(Width - 1 - Column) + Row * Pitch]
就得到左右镜像(像素水平移动),写Image[Column + (Height - 1 - Row) * Pitch]
就得到上下镜像(像素垂直移动)。
你可以结合这两个修改来实现180°旋转。
写入文件时,通常会从文件开头向文件结尾写入数据。在大多数情况下,以任何其他顺序编写都会使您的程序更复杂并且性能更差。
所以您需要的是根据您想要翻转数据的方式以正确的顺序访问您的数据。
类似于:
#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