读取PPM文件并将其存储在数组中;用C编码

2024-03-18

我需要读取 PPM 文件并将其存储在用 C 编写的数组中。 有人可以帮我做这个吗?

多谢。


以下代码展示了如何读取、更改像素颜色以及写入图像 PPM 格式。我希望它有帮助。

#include<stdio.h>
#include<stdlib.h>

typedef struct {
     unsigned char red,green,blue;
} PPMPixel;

typedef struct {
     int x, y;
     PPMPixel *data;
} PPMImage;

#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR 255

static PPMImage *readPPM(const char *filename)
{
         char buff[16];
         PPMImage *img;
         FILE *fp;
         int c, rgb_comp_color;
         //open PPM file for reading
         fp = fopen(filename, "rb");
         if (!fp) {
              fprintf(stderr, "Unable to open file '%s'\n", filename);
              exit(1);
         }

         //read image format
         if (!fgets(buff, sizeof(buff), fp)) {
              perror(filename);
              exit(1);
         }

    //check the image format
    if (buff[0] != 'P' || buff[1] != '6') {
         fprintf(stderr, "Invalid image format (must be 'P6')\n");
         exit(1);
    }

    //alloc memory form image
    img = (PPMImage *)malloc(sizeof(PPMImage));
    if (!img) {
         fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    //check for comments
    c = getc(fp);
    while (c == '#') {
    while (getc(fp) != '\n') ;
         c = getc(fp);
    }

    ungetc(c, fp);
    //read image size information
    if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
         fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
         exit(1);
    }

    //read rgb component
    if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
         fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
         exit(1);
    }

    //check rgb component depth
    if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
         fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
         exit(1);
    }

    while (fgetc(fp) != '\n') ;
    //memory allocation for pixel data
    img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));

    if (!img) {
         fprintf(stderr, "Unable to allocate memory\n");
         exit(1);
    }

    //read pixel data from file
    if (fread(img->data, 3 * img->x, img->y, fp) != img->y) {
         fprintf(stderr, "Error loading image '%s'\n", filename);
         exit(1);
    }

    fclose(fp);
    return img;
}
void writePPM(const char *filename, PPMImage *img)
{
    FILE *fp;
    //open file for output
    fp = fopen(filename, "wb");
    if (!fp) {
         fprintf(stderr, "Unable to open file '%s'\n", filename);
         exit(1);
    }

    //write the header file
    //image format
    fprintf(fp, "P6\n");

    //comments
    fprintf(fp, "# Created by %s\n",CREATOR);

    //image size
    fprintf(fp, "%d %d\n",img->x,img->y);

    // rgb component depth
    fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);

    // pixel data
    fwrite(img->data, 3 * img->x, img->y, fp);
    fclose(fp);
}

void changeColorPPM(PPMImage *img)
{
    int i;
    if(img){

         for(i=0;i<img->x*img->y;i++){
              img->data[i].red=RGB_COMPONENT_COLOR-img->data[i].red;
              img->data[i].green=RGB_COMPONENT_COLOR-img->data[i].green;
              img->data[i].blue=RGB_COMPONENT_COLOR-img->data[i].blue;
         }
    }
}

int main(){
    PPMImage *image;
    image = readPPM("can_bottom.ppm");
    changeColorPPM(image);
    writePPM("can_bottom2.ppm",image);
    printf("Press any key...");
    getchar();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取PPM文件并将其存储在数组中;用C编码 的相关文章

随机推荐

  • React Native StatusBar:深色内容在 Android 上不起作用

    我正在尝试将标题的颜色和状态栏的图标更改为黑色 所以 根据react native状态栏文档 我设置了barStyle to dark content但没有任何改变
  • C99 中的引用传递

    我刚刚读过this http cartan cas suffolk edu oopdocbook opensource passreference html 在C 和C99 中 我们可以绕过 参考 它提供了相同的 性能相当于指针传递 所以我
  • 如何将 Quickbook 桌面应用程序与网站集成

    我是 Quick Book 的新人 现在我正在准备一个管理面板 在线网站 其中我必须与 Quick Book 桌面版本集成 我正在使用 NET C 平台制作这个网站 这里有一些帖子 但我仍然不清楚 简而言之 我的要求是 我们需要发送提供商名
  • javascript 函数在 jquery $(document).ready 块中不起作用

    我正在尝试打电话JavaScript函数从onclick扳机 HTML部分 div class my radio div
  • 如何使用 Sublime Text 运行节点应用程序

    如何使用 Sublime Text 运行节点应用程序 像这样 在sublime中打开app js文件 进入菜单 gt 工具 gt 构建 它 就运行了 就这么简单 Cmd Shift P 搜索 Nodejs Default File Sett
  • 反序列化 MongoDB BSON

    我尝试从查询 MongoDB 实例的 REST 服务获取响应并将响应解析为 Java 对象 Web 服务使用 MIME 类型的 html 返回响应 并用换行符分隔返回的每个记录 尽管我能够调整服务返回的内容 将 BSON 响应转换为 Jav
  • 自动更新数据库Mysql中的库存

    我需要了解数据库中的一件事 我有产品表及其总库存 如图所示 如果有人知道我该怎么做 请分享 谢谢 当提到关系数据库时 您所问的问题在技术上并不是技术意义上的 关系 这种关系就像有一个表引用另一个表的 键 例如将具有客户地址的表与具有客户订单
  • Azure - 启动命令 - 无法访问 jarfile app.jar

    我有一个 Java Spring Boot 应用程序 部署在 Azure Web 服务上 一切正常 我此刻真正想做的是 java jar Dspring profiles active test app jar 我想通过 Azure 云上的
  • 将 msbuild 任务作为 nuget 传送

    我需要你的帮助 我正在开发一个 msbuild 任务 该任务对 msbuild 执行某些操作 我希望我的用户能够下载并安装 nuget 包 安装包后 构建任务将成为构建过程的一部分 我知道如何发布 nuget 包 并且知道如何将自定义目标文
  • C++:受保护的类构造函数

    如果一个类总是要被继承 那么创建构造函数是否有意义protected class Base protected Base class Child protected Base public Child Base Thanks 仅当您不希望客
  • tsql 脚本来查找未被存储过程、视图、函数等使用的表?

    是否有一个 t sql 脚本来找出 sql server 中没有通过存储过程 视图 函数等使用的表 我有一个数据库 有 100 个表 如果不是更多的话 在我删除表之前 我想知道是否有一个脚本可以遍历数据库中的每个对象并告诉我是否有任何表正在
  • 共享互斥体的交替例程

    我有方法a在某个随机时间重复调用 从而触发方法b 它在一段随机时间后完全执行 并且在它自己的线程中 我想确保随后执行a等到b已完成 由当前执行触发a 换句话说 a and b均须交替执行 我尝试使用互斥体和条件变量来执行此操作 如下所示 d
  • pytorch - “conv1d”在哪里实现?

    我想看看 conv1d 模块是如何实现的https pytorch org docs stable modules torch nn modules conv html Conv1d https pytorch org docs stabl
  • DI 和存储库模式

    目前 我的代码与此类似 为了说明一点而缩短 DAL 存储库接口 public interface IRepository
  • VM Tracker 显示较大的脏大小

    我的应用程序的一部分是我同时执行操作的 它们包括初始化许多 CALayer 并将它们渲染为位图 不幸的是 在这些操作期间 在 iphone 4 上每个操作大约需要 2 秒才能完成 VM Tracker 指示的脏大小飙升至约 120MB 分配
  • Java泛型:获取泛型方法的返回类型的类

    背景 我曾经写过这个方法 private
  • 动态标签宽度文本字段概述材料ui反应

    我有一个文本字段变体outlined 我有一个动态标签 问题是当它改变时 顶线的宽度保持与第一次相同
  • Mac OS X 的 CMake 2.8.10 安装无法创建符号链接

    我正在使用 OS X Lion 10 7 5 更新 Mac Book pro 中的 Cmake Cmake的旧版本是2 8 8 新版本是2 8 10 当我运行到安装过程快结束时 安装程 序提示 用于创建多个工具的 usr bin 的符号链接
  • WAR 文件和 Subversion

    我应该如何在 Eclipse 中处理 WAR 文件 使用 GWT 和 Subversion 问题自动柜员机 就是当将 war 文件夹添加到 SVN 时 它包含所有已编译的代码 我没有选项过滤掉这些代码 这使得 svn 签出变得漫长且毫无意义
  • 读取PPM文件并将其存储在数组中;用C编码

    我需要读取 PPM 文件并将其存储在用 C 编写的数组中 有人可以帮我做这个吗 多谢 以下代码展示了如何读取 更改像素颜色以及写入图像 PPM 格式 我希望它有帮助 include