CoreGraphics на iPhone. Как правильно загрузить файл PNG с предварительно умноженным альфа-каналом? - PullRequest
3 голосов
/ 29 марта 2010

Для моих приложений iPhone 3D в настоящее время я использую CoreGraphics для загрузки файлов PNG с предварительно умноженной альфа-версией. Вот основы:

// load a 4-channel rgba png file with pre-multiplied alpha. 
CGContextRef context =  
CGBitmapContextCreate(data, width, height, 8, num_channels * width, colorSpace, 
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

// Draw the image into the context
CGRect rect =  CGRectMake(0, 0, width, height); 
CGContextDrawImage(context, rect, image); 
CGContextRelease(context); 

Затем я использую данные в качестве текстуры в OpenGL.

Мой вопрос: указав предварительно умноженную альфу - kCGImageAlphaPremultipliedLast - я - случайно - говорю CoreGraphics умножить каналы rgb на альфу или - что я предположил - я просто указываю, что формат входящего изображения предварительно умноженная альфа?

Спасибо, Дуг

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

Указывая предварительно умноженную альфу - kCGImageAlphaPremultipliedLast - я - непреднамеренно - приказываю CoreGraphics умножить каналы rgb на альфу или - что я предположил - я просто указываю, что формат входящего изображения имеет предварительно умноженную альфа?

Ни один. Вы указали формат адресата (контекст), а не источника. Источник - объект изображения - знает, предварительно ли умножены цвета его пикселей, и Кварц будет использовать эти знания, чтобы делать правильные вещи, когда рисует исходное изображение в контексте.

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

Я не знаю достаточно OpenGL, чтобы знать, является ли это проблемой, и если это так, то, вероятно, нет решения для этого кода: по крайней мере, на Mac Quartz не поддерживает неумноженные цвета в растровых контекстах .

Вместо этого вы можете попробовать этот формат хранения .

2 голосов
/ 03 сентября 2010

Для использования в будущем для тех, кто сталкивается с этой проблемой, вот пример того, как демультиумножить:

    /////// .... 
    /////// load the image into imageRef up here
    /////// e.g. with CGImageSourceCreateWithURL(); and CGImageSourceCreateImageAtIndex(); on OS X
    /////// or, by accessing CGImage property of UIImage 
    ///////  
    /////// then extract bitsPerComponent, bytesPerRow and color space 
    /////// .... 


    // draw CG image to a byte array
    CGContextRef bitmapContext = CGBitmapContextCreate(img->data,
                                                       img->w, img->h,
                                                       bitsPerComponent, 
                                                       bytesPerRow,
                                                       space,
                                                       kCGImageAlphaPremultipliedLast);

    CGContextDrawImage(bitmapContext,CGRectMake(0.0, 0.0, (float)img->w, (float)img->h),imageRef);
    CGContextRelease(bitmapContext);

    // let's undo premultiplication
    for(int i=0; i < bytesPerRow * img->h; i+=4)
    {
        for(int j=0; j<3; j++)
        {
            img->data[i+j] = img->data[i+j] / (img->data[i+3]/255.);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...