glReadPixels并保存到图像

时间:2012-10-09 15:30:18

标签: objective-c macos opengl

我有app,其中用户拖放图像,并且正在使用OpenGL重新绘制以进行一些可用的处理。一切正常。当用户想要保存他的图像时,就像这样:

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

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

例如:

.PNG

当我打开并保存此图片时: enter image description here

我明白了:
enter image description here

如果我打开并保存此图片: enter image description here

我明白了:
enter image description here

.JPG

如果我打开并保存:
enter image description here

我明白了:
enter image description here

当我打开并保存时:
enter image description here

我明白了:
enter image description here

因此,有时图像会严重节省。为什么会这样?


这就是我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未被编辑。

2 个答案:

答案 0 :(得分:2)

在竞争像素数据之前,你必须告诉OpenGL如何“格式化”它。这意味着设置→glPixelStore的所有GL_PACK_参数。最重要的是对齐参数。另外请记住用每个像素编写正确数量的组件的文件,并从OpenGL中读取正确的组件。

答案 1 :(得分:0)

我有相同的

您只需设置正确的bytesPerRow

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