C读取bmp文件

2024-01-02

我正在尝试将 bmp 文件读入我的程序,但遇到了一些问题。读入文件后,如果我告诉它打印 pBmp->header.fileSize,它会显示 16,但如果我在十六进制编辑器中查看它,如果我将该值修改为正确的文件大小,则文件大小部分为 F6 7A 10 00在十六进制中,它会显示 F6 7A F6 7A 10 00 但这会遇到 resv1,它应该始终为零。我知道这只是读取 1 个像素的数据,另一个问题是当我尝试使用 while 循环读取像素直到文件末尾时出现分段错误。我确实花了几个小时在谷歌上搜索试图弄清楚这一点,但我运气不佳。

// The BMPHEADER structure.
typedef struct {
    byte        sigB;
    byte        sigM;
    int32_t     fileSize;
    int16_t     resv1;
    int16_t     resv2;
    int32_t     pixelOffset;
} tBmpHeader;

// The BMPINFOHEADER structure.
typedef struct {
    int32_t     size;
    int32_t     width;
    int32_t     height;
    int16_t     colorPlanes;
    int16_t     bitsPerPixel;
    byte        zeros[24];
} tBmpInfoHeader;

typedef uint8_t byte;

typedef struct {
    byte blue;
    byte green;
    byte red;
} tPixel;

// A BMP image consists of the BMPHEADER and BMPINFOHEADER structures, and the 2D pixel array.
typedef struct {
    tBmpHeader      header;
    tBmpInfoHeader  infoHeader;
    tPixel          **pixel;
} tBmp;

tPixel **BmpPixelAlloc(int pWidth, int pHeight)
{
    tPixel **pixels = (tPixel **)malloc (pHeight * sizeof(tPixel *));
    for (int row = 0; row < pHeight; ++row)
    {
        pixels[row] = (tPixel *)malloc(pWidth * sizeof(tPixel));
    }

    printf("pixelAlloc\n"); 

    return pixels;
}

pBmp->pixel = BmpPixelAlloc(pBmp->infoHeader.width, pBmp->infoHeader.height);
if(FileRead(file, &pBmp->pixel, sizeof(tPixel), 1)!=0)
{ 
    errorCode = ErrorFileRead;
}

你永远不应该对结构使用直接 I/O:仅仅因为你已经声明了你的struct与 BMP 标头的顺序相同,不能保证您的编译器具有端到端的字段,中间没有任何内容。

编译器经常遵守平台的对齐限制,这可能会导致它们在字段之间添加填充字节以确保例如大字段的起始地址是对齐的。

您需要使用特定于编译器的魔法来强制“打包”结构,或者逐字节 I/O 到结构中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C读取bmp文件 的相关文章

随机推荐

  • 在 Cocos2d 和 Box2d 中获取物体上的接触点

    我很new对于 Cocos2d 和 Box2d 我 一直在关注教程 http www raywenderlich com 和 一般是黑客攻击 不过 我有一个 我无法解决的问题 我创建了 2 个主体和固定装置 在 Box2d 世界中 并创建了
  • 具有多个条件的 if 语句[重复]

    这个问题在这里已经有答案了 由于我缺乏 Bash 知识 我带着一个小问题来找你 我有一个包含 41 个文件夹的 Apps 目录 每个文件夹中都有一个css包含glue1 css 文件的子目录 我的目标是通过 bash 循环删除该 css 文
  • AngularJS在容器中无限滚动

    我正在尝试使用AngularJS无限滚动 http binarymuse github io ngInfiniteScroll 它似乎仅在滚动相对于浏览器窗口时才起作用 我想在内部 DIV 中进行无限滚动 即我有一个带有通用包装器的页面和一
  • 启动画面图标未完全显示

    我使用新的闪屏 API 为 API 级别 23 以下的所有 Android 版本添加均匀的闪屏 启动图标有什么要求吗 目前我尝试使用 svg 我认为它会在不同的屏幕上自动调整大小 有没有人也经历过这种情况并有解决方法或知道这些 隐藏的 要求
  • 自定义表单身份验证+MVC3+AuthorizeAttribute

    我本质上做的是this https stackoverflow com a 2342196 69735 但是 每当我使用内置的 AuthorizeAttribute 时 MVC 框架 我猜 永远不会查看我的主体来确定用户是否具有正确的角色
  • 从evaluateJavaScript函数的完成处理程序返回HTML字符串

    我知道我不是第一个问这个问题的人 但我无法解决这个问题 我正在尝试使用以下方法从 HTML 中获取一段字符串evaluateJavaScript在带有 Swift 3 的 Xcode 中 这段文本被称为value在完成处理程序中 所以我这样
  • CKeditor Html 5
    标签问题

    我使用 CKeditor 版本 4 我面临与 HTML 5 标签相关的问题 输入HTML代码 div class col md 4 col sm 4 div class item cont a href contents view home
  • Ruby on Rails 私人链接共享:Google 文档风格

    让用户能够共享内容的最佳方式是什么 私人链接使任何点击它的人都可以查看具有隐私限制的特定页面 文档 项目 就我而言 用户创建的事件仅限于数据库中的某些关系组 即 朋友 朋友的朋友等 我有一个 在 过滤器之前在事件控制器中检查当前登录用户的资
  • 在 Android 应用程序中使用 smack 进行文件传输。

    这个错误出现在日志中 from kutbi1 360degree Smack to akash 360degree Smack type error id hK1L6 5 gt
  • 具有多个子字段的 Drupal 自定义 CCK 字段

    有没有办法创建一个可以有多个值的复合字段 每个值都有另一组复合值 例如 我们希望最后有这样的结构 Group 1 unlimited number of groups 子字段 每组无限个子字段 子字段 Group 2 子字段 子字段 对于定
  • 如何防止 WordPress 页面被用户删除

    一些 WordPress 插件会创建页面或帖子 插件的正常功能依赖于该页面或帖子的存在 例如 管理电子邮件列表的插件可能依赖于取消订阅页面 用户可能会有意或无意地删除该页面 插件如何防止其页面被删除 首先 当您创建页面时 您可以将其 ID
  • 直接在 Intellij Idea/WebStorm 中运行笑话测试?

    我在用着jest https facebook github io jest 在我的 ReactJS 应用程序中编写测试 到目前为止 要运行我的测试套件 我需要输入 npm test 这是 package npm 中的片段 scripts
  • Python3没有这样的文件或目录

    我正在尝试制作 python3 可执行脚本并从 shell 运行它们 我的系统上安装了 python 3 4 0 所以 我添加了 home spandan python codes 目录到Python路径 因为我计划将我的脚本和模块保留在这
  • AWS CodePipeline 将多个存储库作为单一源进行跟踪

    我正在调查 CodePipeline 是否适用于我们的用例 我们有数百个存储库 全部由 CodeCommit 托管 除了较小的配置之外 所有这些的构建 测试 发布过程都是相同的 我想做的是建立一个管道 用于构建 测试 发布在任何这些存储库中
  • R传单。将点数据分组到单元格中以汇总许多数据点

    早上 下午或晚上 我有以下位置数据 调整自 网格单元内采样点的计数 https stackoverflow com questions 56217221 count of sampling points within a grid cell
  • Eclipse Luna CDT:什么是标头变体?

    我很难让 Eclipse Indexer Codan 识别头文件中的某些数据声明 有一个新的偏好索引所有标头变体 http wiki eclipse org CDT User NewIn83 Preferences for header v
  • 使用“功能分支”与重构兼容吗?

    特征分支 是指每个功能都在自己的分支中开发 只有在经过测试并准备好交付后才合并到主线中 这允许产品所有者选择进入给定发货的功能 并在出现更重要的工作时 保留 部分已编写的功能 例如 客户打电话给 MD 投诉 重构 正在改造代码以改进其设计
  • 将应用程序更新到应用程序商店:审核时间以及商店的评分?

    这太令人沮丧了 我已将我们的应用程序上传到应用程序商店 8 天后获得批准 然后我下载了它 发现加速度计卡住了 所以我去了itunes connect 将发布日期更改为未来的发布日期 取消选中世界上所有的商店 它说 已被开发人员删除 这就是我
  • 透明着色器允许下面的对象显示在上面

    在我的场景中 笑脸 带有 png 图像的四边形 放置在 Y 0 处 点 带有平铺 3X3 的四边形 放置在 Y 0 25 处 我需要用于笑脸的着色器是透明漫反射 因为我使用的是圆形 png 图像 但我在下面使用的点显示在笑脸上方 使用任何其
  • C读取bmp文件

    我正在尝试将 bmp 文件读入我的程序 但遇到了一些问题 读入文件后 如果我告诉它打印 pBmp gt header fileSize 它会显示 16 但如果我在十六进制编辑器中查看它 如果我将该值修改为正确的文件大小 则文件大小部分为 F