- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我为 pgm 文件编写了一个 I/O。我的程序读取一个 pgm 并将它的数据写入一个新的 pgm 文件。但不知何故,它只写入了一半的数据,我花了数小时寻找错误但找不到。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct {
int row;
int col;
int max_greyscale;
int **pixel_matrix;
} PGMData;
int **mem_alloc(int row, int col) {
int **ret;
ret = malloc(sizeof(int *) * row);
if (ret == NULL) {
perror("Error while allocating memory (NULL)");
exit(EXIT_FAILURE);
}
for (int i = 0; i < row; i++) {
ret[i] = malloc(sizeof(int) * col);
if (ret[i] == NULL) {
perror("Error while allocating memory (NULL)");
exit(EXIT_FAILURE);
}
}
return ret;
}
void destroy(int **pixel_matrix, int row) {
for (int i = 0; i < row; i++) {
free(pixel_matrix[i]);
}
free(pixel_matrix);
}
void ignoreComments(FILE *fp) {
int c;
char line[100];
while((c = fgetc(fp)) != EOF && isspace(c))
;
if (c == '#') {
fgets(line, sizeof(line), fp);
ignoreComments(fp);
} else {
fseek(fp, -1, SEEK_CUR);
}
}
PGMData* readFile(const char *filename, PGMData *data) {
FILE *fp;
char magic[3];
fp = fopen(filename, "r");
if (fp == NULL) {
perror("Error while reading file (NULL)");
exit(EXIT_FAILURE);
}
fgets(magic, sizeof(magic), fp);
ignoreComments(fp);
fscanf(fp, "%d", &data->col);
ignoreComments(fp);
fscanf(fp, "%d", &data->row);
ignoreComments(fp);
fscanf(fp, "%d", &data->max_greyscale);
fgetc(fp);
data->pixel_matrix = mem_alloc(data->row, data->col);
// read
for (int i = 0; i < data->row; i++) {
for (int j = 0; j < data->col; j++) {
data->pixel_matrix[i][j] = fgetc(fp);
}
}
fclose(fp);
return data;
}
void writeFile(const char *filename, const PGMData *data) {
FILE *fp;
fp = fopen(filename, "w");
if (fp == NULL) {
perror("Error while writing file (NULL)");
exit(EXIT_FAILURE);
}
fprintf(fp, "P2\n");
fprintf(fp, "%d %d\n", data->col, data->row);
fprintf(fp, "%d\n", data->max_greyscale);
for (int i = 0; i < data->row; i++) {
for (int j = 0; j < data->col; j++) {
fputc(data->pixel_matrix[i][j], fp);
}
}
fclose(fp);
destroy(data->pixel_matrix, data->row);
}
int main(int argc, char *argv[]) {
printf("P1\n");
const char * source_file = argv[1]; // source
const char * destin_file = argv[2]; // destination
PGMData pgm_pic;
PGMData * data = &pgm_pic;
data = readFile(source_file, data); // read source
writeFile(destin_file, data); // write to destination
return 0;
}
它给了我这个 PGM:
P2
# feep.ascii.pgm
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这个输出:
P2
24 7
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0
0 3 0 0 0 0 0 7 0 0 0 0
最佳答案
但 P2 格式将像素存储为从 0 到 255 的以空格分隔的 ASCII 十进制数,如您的输入和输出所示,而不是单字节二进制值。您需要使用 fscanf
将每个像素值读取为十进制数,并使用 fprintf
将每个像素值打印为十进制数。 – 伊恩·阿博特
关于c - pgm-file I/O 给我一半的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088798/
#include void lower_string(char*); int main() { char string[100]; printf("Enter
如何使用 Java 将二进制 PGM 文件转换为 ASCII PGM 文件? 当我使用以下代码时,我无法在 B.pgm 中写入 ASCII 值。我也尝试过使用dos.writeInt。 FileInp
我正在尝试对 pgm 执行卷积类型图像 P5 (二进制)使用以下设置: 输入输出数组 vector> image(rows, vector(cols, '\0')); vector> out(rows
我的机器上安装了 zmq 版本 4.1.3 和 pyzmq 版本 15.2.0(我假设是通过 pip 但我现在不记得了)。我需要连接到 UDP epgm 套接字,但收到错误“协议(protocol)不
我目前正在做一个学生项目,它对灰度 pgm 文件进行一些图像处理(膨胀和腐 eclipse )。我试图对图像对象实现扩张,但得到了奇怪的结果。我预计图像对象会比原始图像大。但是根据我使用的内核大小,我
以下代码适用于管理员帐户,但对于非管理员帐户,它会打印两次成功然后抛出 System.Net.Sockets.SocketException (0x80004005):尝试以其禁止的方式访问套接字访问
我需要在库 netpbm/pgm 中创建拉普拉斯运算符。处理图像很简单 - 我计算每个像素。我不使用标准化,因为我知道它是 0 并且我想简化解决方案。 我的代码: #include #include
我需要为类项目创建 PGM 图像的单个灰度直方图。我已经有了读取 PGM 图像的代码。但是我不完全理解如何计算唯一的像素值。我不需要输出图表或类似的东西。任何帮助将不胜感激! 读取PGM图像的代码 h
int i, j; for (i = (*pgm).height - 1; i >= 0; i--) for (j = 0; j < (*pgm).width; j++)
您好,我有一个关于读取 pgm 值的底部值的问题。我制作了一个 2d 动态数组,并为高度和宽度添加了 2 个额外的空格,以便能够创建缓冲区,但是当我尝试读取时将第一个整数设置为 width+1 它不起
我正在尝试自学数字图像处理。我已将我的 pgm 读入结构中。在这个结构中我有像素数组。我可以打印得很好。现在我想根据用户输入裁剪这张照片。我接受这些输入并根据输入的坐标得到一个黑色矩形。我做错了什么?
我正在尝试使用这段代码编写一个 pgm 文件.. myfile (image), (sizeRow*sizeColumn)*sizeof(unsigned char)); 如果我尝试将其写入 .txt
我有一个非常奇怪的错误, 所以我尝试通过将其像素值加载到数组中来读取 pgm 图像,我能够正确读取其版本、高度、宽度和最大可能像素值。然而,当我开始读取像素值时,我总是得到 0。(我知道它不是零,因为
我的目标是读入 PGM 图像并生成颜色值反转的图像。但是当我输入 this image ,我回来了this image .我在 C 中编程,在 Windows 7(64 位)上使用 Eclipse 和
我正在尝试从 .pgm 图像文件 (mars.pgm) 的 header 读取大小值,并使用 sscanf 将结果值分配给整数变量 u 和 v。 程序执行时在第一行打印 P5 832 700 127,
我正在尝试读取和重写 PGM 图像,但它会导致形状困惑。右图为原图,左图为重制图: 这是我正在使用的代码: #include #include #include #include using
我有一百个 128 x 128 的 .pgm 文件,上面有一些形状,我认为它们的色阶是 255(虽然不确定这个,所以如果解决方案也可以接受它会很好考虑),我需要提取这些颜色来处理图像。所以我想最终得到
我有一个包含 0-254 灰度值的 int 数组,我还有图像的 x 和 y 大小。创建 pgm 图像是一件容易的事情,但我想在 jsp 中显示它,所以我需要以某种方式将其转换为 jpeg 或 png
我已经被这个问题困扰了一段时间了。我如何将 pgm 文件中的像素值 0-255 复制到数组中?这是我到目前为止所拥有的。我知道我偏离了应有的样子。 #include #include int ma
我正在尝试将 JavaScript 中的 Canvas 转换为 pgm。在我转换文件并将其下载到我的 table 面后,它具有 pgm 扩展名,但是当我用编辑器打开它时,它被编码为 png。我认为
我是一名优秀的程序员,十分优秀!