glReadPixels -> NSData -> сохранить изображение

Я создаю 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 и записать в файл. Но я получаю перевернутое изображение. Как я могу это исправить?


person hockeyman    schedule 14.08.2012    source источник


Ответы (2)


Нарисуйте перевернутую NSImage. Это придаст перевернутому изображению правильную ориентацию. Затем вы получаете представление NSImage в формате tiff, которое вы можете изменить на другие типы изображений, используя другое NSBitmapImageRep с imageRepWithData:. Используйте новое представление изображения, чтобы создать новый объект 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];
person Vinny Rose    schedule 23.08.2012

bytesPerRow должно быть (width*3+3)&~3

person Volodymyr B.    schedule 23.03.2013