我想问一下是否有可能从上到下写入文件? 下面的当前代码将垂直翻转并成像。 这使用从左到右的方式写入文件。
另一方面,如果在写入文件时遵循从左到右的模式,我将如何水平翻转图像出现问题。 注意:这里我还有其他选择,那就是从上到下交换行。
谁知道也许有一种方法可以遵循“垂直翻转”模式。
我很感谢你们能提供的任何帮助。谢谢。
//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);
}
}
}
答案 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