glReadPixels - > NSData - >保存图片

时间:2012-08-14 08:22:29

标签: objective-c opengl save writetofile

我创建了NSBitmapImageRep,我用glReadPixels信息填充。它看起来像这样:

    NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:width pixelsHigh:height bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:3 * width bitsPerPixel:0];
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, [imageRep bitmapData]);

然后将其转换为NSData并写入文件。但我翻了颠倒的形象。我该如何解决?

2 个答案:

答案 0 :(得分:1)

画成翻转的NSImage。这会将倒置图像绘制到正确的方向。然后,您可以使用另一个NSImage NSBitmapImageRep来获取imageRepWithData:的tiff表示,您可以将其更改为其他图像类型。使用新的图像表示使用NSData创建新的representationUsingType:properties:对象,并将新的NSData对象保存到文件中。

    NSRect rect = self.bounds;
    NSSize size = rect.size;
    GLsizei width = (GLsizei)size.width;
    GLsizei height = (GLsizei)size.height;
    NSBitmapImageRep* imgRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:width pixelsHigh:height bitsPerSample:8 samplesPerPixel:3 hasAlpha:NO isPlanar:NO colorSpaceName:NSDeviceRGBColorSpace bytesPerRow:width*3 bitsPerPixel:0];
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, [imgRep bitmapData]);
#ifdef __MAC_10_8
    NSImage* image = [NSImage imageWithSize:size flipped:YES drawingHandler:^(NSRect dstRect){
        return [imgRep drawInRect:dstRect];
    }];
#else
    NSImage* image = [[NSImage alloc] initWithSize:size];
    [image lockFocusFlipped:YES];
    [imgRep drawInRect:rect];
    [image unlockFocus];
#endif
    NSData* tiff = [image TIFFRepresentation];

答案 1 :(得分:0)

bytesPerRow应为(width*3+3)&~3