Управление необработанными данными PNG - PullRequest
1 голос
/ 04 ноября 2011

Я хочу прочитать файл PNG, чтобы я мог:

a) Получить доступ к необработанным растровым данным этого файла, используя без регулировки цветового пространства или предварительное умножение альфа.

b) На основе этого растрового изображения отобразите битовые фрагменты (любые одиночные бит R, G, B или A по всему изображению) на изображении в окне.Если у меня есть растровое изображение, я могу найти правильные биты, но во что я могу их вставить, чтобы получить их на экране?

c) После некоторой модификации битовых плоскостей напишите новый файл PNG, опять же, без корректировок.

Это только для определенных конкретных изображений.Предполагается, что PNG не будет иметь никаких данных, кроме просто RGBA-32.

Из-за прочтения некоторых подобных вопросов я подозреваю NSBitmapImageRep для чтения / записи файла и рисование в NSView для экранной части,Это звучит правильно?

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

1.) Вы можете использовать NSBitmapImageRep's -bitmapData для получения необработанных данных пикселей. К сожалению, CG (серверная часть NSBitmapImageRep) не поддерживает нативное умножение, поэтому вам придется умножать себя. Используемое здесь цветовое пространство будет таким же, как и в файле. Вот как можно перемножить данные изображения:

NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:data];
    NSInteger width = [imageRep pixelsWide];
    NSInteger height = [imageRep pixelsHigh];

    unsigned char *bytes = [imageRep bitmapData];
    for (NSUInteger y = 0; y < width * height * 4; y += 4) { // bgra little endian + alpha first
        uint8_t a, r, g, b;

        if (imageRep.bitmapFormat & NSAlphaFirstBitmapFormat) {
            a = bytes[y];
            r = bytes[y+1];
            g = bytes[y+2];
            b = bytes[y+3];
        } else {
            r = bytes[y+0];
            g = bytes[y+1];
            b = bytes[y+2];
            a = bytes[y+3];
        }

        // unpremultiply alpha if there is any
        if (a > 0) {
            if (!(imageRep.bitmapFormat & NSAlphaNonpremultipliedBitmapFormat)) {
                float factor = 255.0f/a;
                b *= factor;
                g *= factor;
                r *= factor;
            }
        } else {
            b = 0;
            g = 0;
            r = 0;
        }
        bytes[y]=a; // for argb
        bytes[y+1]=r;
        bytes[y+2]=g;
        bytes[y+3]=b;
    }

2.) Я не мог придумать простой способ сделать это. Вы можете создать свой собственный метод рисования изображений, который просматривает необработанные данные изображения и генерирует новое изображение на основе значений. См. Выше, чтобы узнать, как начать это делать.

3.) Вот метод для получения CGImage из необработанных мест данных (вы можете записать png в файл, используя встроенные функции CG, или преобразовать его в NSBitmapImageRep, если CG делает вас неудобным)

static CGImageRef cgImageFrom(NSData *data, uint16_t width, uint16_t height) {
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGImageAlphaFirst;

CGImageRef cgImage = CGImageCreate(width, height, 8, 32, 4 * width, colorSpace, bitmapInfo, provider, NULL, NO, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return cgImage;
}

Вы можете создать объект NSData из объекта необработанных данных с помощью + dataWithBytes: length:

0 голосов
/ 05 ноября 2011

Я никогда не работал в этой области, но вы можете использовать Image IO для этого.

...