【问题标题】:glReadPixels and save to imageglReadPixels 并保存到图像
【发布时间】:2013-03-24 01:12:24
【问题描述】:

我有一个应用程序,用户可以在其中拖放图像,并使用OpenGL 重新绘制它以进行一些可行的处理。一切正常。当用户想要保存他的图像时,它的工作方式如下:

glReadPixels -> NSBitmapImageRep -> NSData -> Write to file

这也有效。几乎。对于某些图像,它无法正常工作。

例如:

.png

当我打开并保存这张图片时:

我得到:

如果我打开并保存这张图片:

我得到:

.jpg

如果我打开并保存:

我得到:

当我打开并保存时:

我得到:

所以有时图像保存得不好。为什么会这样?


这就是我的NSBitmapImageRep 的分配方式:

NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:_image_width pixelsHigh:_image_height bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:3 * _image_width bitsPerPixel:0];

并且GL_PACK_ALIGNMENT 未被编辑。

【问题讨论】:

  • 您是否使用默认的 4(字节)GL_PACK_ALIGNMENT 并尝试抓取 RGB(3 字节)图像?
  • 我没有编辑 GL_PACK_ALIGNMENT,我正在抓取 RGB 图像
  • 我在 glReadPixels 之前添加了glPixelStorei(GL_PACK_ALIGNMENT, 3);,它没有影响任何东西
  • @JuliusPetraška:包对齐的有效值为 1、2、4 和 8。包对齐不是单个像素的大小,而是行开始的地址对齐。我很确定你想将 GL_PACK_ALIGNMENT 设置为 1

标签: objective-c macos opengl


【解决方案1】:

在输入像素数据之前,您必须告诉 OpenGL 如何“格式化”它。这意味着设置→glPixelStore 的所有GL_PACK_ 参数。对您来说最重要的是对齐参数。还要记住,写入每个像素具有正确数量的组件的文件,并从 OpenGL 中读取正确的组件。

【讨论】:

  • 应该在哪里设置glPixelStore 参数?在设置 NSBitmapImageRep 之前?或者在设置OpenGL上下文之后?还是在哪里?
  • OpenGL 是一个状态机。您在重要之前设置状态。在您的情况下,就在调用 glReadPixels 之前。
  • 我在 glReadPixels 之前添加了glPixelStorei(GL_PACK_ALIGNMENT, 3);,它没有影响任何东西
【解决方案2】:

我也一样

您只需要设置正确的 bytesPerRow

bytesPerRow:(width*3+3)&~3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2020-05-25
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多