RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题?

2024-04-24

我需要一种简单的方法将包含 RGB 数据的缓冲区转换为 jpeg。我已经尝试过使用 libjpeg,但我根本无法让它正常工作。例如,将缓冲区保存为位图时会产生以下结果:

使用 libjpeg 在内存中对同一图像进行编码会产生以下结果:

将图像直接保存到文件中只会中止,而不会给出警告、错误或任何内容。

我当然需要一些有用的东西!

这就是我正在做的

void OnKeyPress(unsigned char key, int x, int y) {
  if (key != static_cast<unsigned char>('p'))
    return;

  int width = g_current_width;
  int height = g_current_height;
  boost::scoped_array<boost::uint8_t> buffer(new boost::uint8_t[3 * width * height]);

  glReadBuffer(GL_FRONT);
  glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE,
              reinterpret_cast<GLvoid *>(buffer.get()));
  glReadBuffer(GL_BACK);

  FlipImage(buffer.get(), width, height);

  // Generate a BMP files for testing purposes
  SaveRGB("screenshot.bmp", buffer.get(), width, height);

  jpeg_compress_struct cinfo;
  jpeg_error_mgr jerr;
  cinfo.err = jpeg_std_error(&jerr);
  jerr.trace_level = 10;
  jpeg_create_compress(&cinfo);
  boost::uint8_t *jpeg_buffer_raw = NULL;
  unsigned long outbuffer_size = 0;
  jpeg_mem_dest(&cinfo, &jpeg_buffer_raw, &outbuffer_size);

  cinfo.image_width = width;
  cinfo.image_height = height;
  cinfo.input_components = 3;
  cinfo.in_color_space = JCS_RGB;
  jpeg_set_defaults(&cinfo);

  jpeg_set_quality(&cinfo, 100, true);
  jpeg_start_compress(&cinfo, true);
  int row_stride = width * 3;
  JSAMPROW row_pointer[1];
  int counter = 0;
  std::cout << boost::format("height: %d\n") % height;
  boost::uint8_t *r_buffer = buffer.get();
  while (cinfo.next_scanline < cinfo.image_height) {
    row_pointer[0] = &r_buffer[cinfo.next_scanline * row_stride];
    jpeg_write_scanlines(&cinfo, row_pointer, 1);
    std::cout << boost::format("current line: %d\n") % (counter++);
  }
  jpeg_finish_compress(&cinfo);
  jpeg_destroy_compress(&cinfo);
  std::ofstream jpegfile("screenshot.jpg");
  jpegfile.write(reinterpret_cast<const char*>(jpeg_buffer_raw), outbuffer_size);
  jpegfile.flush();
  // calling free(jpeg_buffer_raw); or delete[] jpeg_buffer_raw; generates an error
}

所以,我发现了问题,而且是在最后,输出文件应该像这样初始化:

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

RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题? 的相关文章

  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 为什么 VB.NET 和 C# 中针对值检查 null 存在差异?

    In VB NET http en wikipedia org wiki Visual Basic NET有时候是这样的 Dim x As System Nullable Of Decimal Nothing Dim y As System
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • 是否有像 gccxml 这样的用于生成包装器的 C 标头解析器工具?

    我需要为一种新的编程语言编写一些 C 标头包装器 并且想要类似 gccxml 的东西 但不完全依赖 gcc 以及它在 Windows 系统上带来的问题 只需要读C而不是C 只要有完整的文档记录 任何格式的输出都可以 Linux Solari
  • 指向字节数组的指针

    由于 Misra C 的要求 我的一位同事想要使用指针声明 但我遇到了一些问题 Misra 安全关键指南 不会让我们纯粹的程序员使用指针 但会让我们对数组字节进行操作 他打算获取一个指向字节数组的指针 因此我们不会在堆栈上传递实际的数组 T
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • “int i=1,2,3”和“int i=(1,2,3)”之间的区别 - 使用逗号运算符的变量声明[重复]

    这个问题在这里已经有答案了 int i 1 2 3 int i 1 2 3 int i i 1 2 3 这些说法有什么区别 我无法找出任何具体原因 Statement 1 Result Compile error 运算符的优先级高于 运算符
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat

随机推荐

  • 在 Emacs org-mode 中设置本地文件变量

    在特定的组织模式文件中 我不希望继承标签 我以为放 org use tag inheritance nil因为第一行可以解决问题 但这似乎不起作用 缺少手动执行setq声明 我怎样才能做到这一点 你缺少一个尾随 在标题评论中 尝试这个 or
  • Eslint 如何只更改代码行

    我需要一种方法来仅在分支上已更改的代码行或块上运行 ESLint 我们的想法是 我们有一个庞大的旧代码库 我们希望强制执行 ESLint 规则at least向前进 我在 CI 中实现了它 对 PR 中更改的所有文件进行了检查 但是人们在接
  • 如何使用 Maptiler 在 Google 地图中显示图块

    我有一个 1810x14871 png 文件 我想将其显示为 Google 地图上的图块 我正在使用Maptiler 我想向您确认几点 1 因为我想在谷歌地图上显示它 因此 在第一个屏幕中我必须选择 墨卡托瓷砖 对吗 2 在坐标系屏幕中 我
  • 目标加速度和子弹减速度随角度变化的弹丸目标预测

    我之前问过一个关于这个话题的问题here https gamedev stackexchange com questions 200260 intercept an accelerating object with a constant v
  • Android 正确关闭相机

    好吧 在过去的几周里 这种情况在我身上发生了几次 但我不知道如何解决它 基本上我的应用程序使用相机 但每隔一段时间 在应用程序上使用相机几次后 它有时会强制关闭 甚至无法与其他应用程序或手机上的默认相机一起使用 我发现解决此问题的唯一方法是
  • IRunningObjectTable.Register 始终将 pdwRegister 设置为 65536,这是一个无效值

    我在用着IRunningObjectTable Register and IRunningObjectTable Revoke如图所示this http www codeproject com KB COM ROTStuff aspx ms
  • 为 Android 实现 Firebase 服务器端倒计时器?

    有没有办法在 Android Studio 中实现 Firebase 服务器端倒计时器 我希望计时器位于服务器端 这意味着每当用户打开我的应用程序时 所有用户的计数器始终会在同一时间 我阅读了以下问题的答案this https stacko
  • 使用 CoffeeScript 以编程方式检查复选框

    如何以编程方式检查 Coffeescript 中的复选框 我知道在 Javascript 中 我可以使用这个 myElement checked true 我可以在 Coffeescript 中执行类似以下操作吗 myElement che
  • 符号字符串强制转换

    Symbol throws 类型错误 无法将符号值转换为字符串 虽然已知的解决方法是使用String Symbol 这看起来与其他原语不一致 包括那些几乎不应该被强制的原语 undefined and null 究竟如何String与 不同
  • 是否可以在更大的表达式中使用可选的 ifPresent() 来减轻对 get() 的调用?

    为了避免打电话get 这可能会引发异常 if a isPresent list add a get 我可以将此表达式替换为 a ifPresent list add 但是如果我需要执行更大的表达式 例如 if a isPresent b c
  • Biopython 成对比对导致循环运行时分段错误

    我正在尝试运行成对全局对齐方法biopython循环大约 10000 对字符串 每个字符串平均长度为 20 个字符 对一对序列运行该方法效果很好 但在循环中运行此操作 低至 4 对 会导致分段错误 如何解决这个问题 from Bio imp
  • 具有持久性的网页导航 - ASP.NET C#

    我有一个已经用 ASP NET 完成的网站 我需要在底部添加一个部分来保存实时流视频聊天 Flash 对象 并且我需要它在不同的页面访问中持续存在 例如我有可能被访问的 profile aspx 和 local aspx 并且我需要底部的小
  • li 元素内的作用域函数未被调用

    我使用 ng repeat 生成 li 在 LI 内部我有输入类型控件 它有一个范围函数 fn btnClose 当我单击按钮时 按钮的单击事件没有被调用 而是 li 的单击事件被触发 我在 js fiddle 中做同样的事情 它在那里工作
  • JSP 包含参数用法

    我应该如何访问param1来自包含的 jsp 的值 navMenu jsp
  • GPars:返回eachParallel{}

    我想对每个示例字符串做很多事情 并在此处返回一些其他类型的对象 整数 然后返回一些更大的类对象 在这个例子中 我正在尝试一些简单的事情 但我得到了完全错误的结果 至少对于我希望得到的东西 xD 我希望得到 6 5 6 5 但我得到的是 bu
  • iPhone/iPad 的核心文本示例

    我正在寻找 iphone ipad 的核心文本示例 但运气不佳 任何线索将不胜感激 我在 Github 上编写了一个小项目 为 Core Text 提供了 Objective C 包装器 https github com akosma Co
  • 如何使用 WHERE 条件中的关联值从 ABAP SQL 消费 CDS?

    我有一个通知标头的 CDS 视图及其状态关联 define view ZNOTIF as select from qmel as notif association 0 to ZNOTIF STATUS as status on statu
  • jquery如何选择所有以“text-”开头的类元素?

    我有一些课程 text 1 text 2 text 3 我想全部选择 该怎么做 谢谢您的帮助 尝试这个 欲了解更多详情 请参阅jquery selectors http api jquery com attribute starts wit
  • 如何在反向代理后面正确设置 JSESSIONID cookie 路径

    我的网络应用程序正在 Tomcat 中运行http localhost 8080 example com 但它是从 Apache 提供的反向代理http example com 在端口 80 上 我的网络应用程序查看request getH
  • RGB 缓冲区到 JPEG 缓冲区,这里出了什么问题?

    我需要一种简单的方法将包含 RGB 数据的缓冲区转换为 jpeg 我已经尝试过使用 libjpeg 但我根本无法让它正常工作 例如 将缓冲区保存为位图时会产生以下结果 使用 libjpeg 在内存中对同一图像进行编码会产生以下结果 将图像直