Получение 0 значений для RGB при попытке изменить пиксели в данных CGImageRef

Привет, ребята, я получаю 0 для значений RGB в этом коде. Есть идеи, почему? InImage был создан с этим CGContext.

-(CGContextRef)createBitmapContextWide:(int) pixelsWide Height:(int) pixelsHigh{

CGContextRef    context = NULL;
CGColorSpaceRef colorSpace;
void *          bitmapData;
int             bitmapByteCount;
int             bitmapBytesPerRow;

bitmapBytesPerRow   = (pixelsWide * 4);
bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

colorSpace = CGColorSpaceCreateDeviceRGB();
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
    fprintf (stderr, "Memory not allocated!");
    return NULL;
}
context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,      // bits per component
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaPremultipliedLast);
if (context== NULL)
{
    free (bitmapData);
    fprintf (stderr, "Context not created!");
    return NULL;
}
CGColorSpaceRelease( colorSpace );

return context;

}

Код, который изменяет цвета пикселей (или должен измениться)

-(UIImage*)convertGrayScaleImageRedImage:(CGImageRef)inImage{

CFDataRef m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));  
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);  

int length = CFDataGetLength(m_DataRef);

for (int i=0; i<length; i+=4){

    int r = i;
    int g = i+1;
    int b = i+2;
    //int a = i+3;//alpha

    NSLog(@"r=%i, g=%i, b=%i",m_PixelBuf[r], m_PixelBuf[g], m_PixelBuf[b]);



    m_PixelBuf[r] = 1;
    m_PixelBuf[g] = 0;  
    m_PixelBuf[b] = 0;  
    //m_PixelBuf[a] = m_PixelBuf[a];//alpha
}  

CGContextRef ctx = CGBitmapContextCreate(m_PixelBuf,  
                                         CGImageGetWidth(inImage),  
                                         CGImageGetHeight(inImage),  
                                         CGImageGetBitsPerComponent(inImage),
                                         CGImageGetBytesPerRow(inImage),  
                                         CGImageGetColorSpace(inImage),  
                                         CGImageGetBitmapInfo(inImage) 
                                         ); 

CGImageRef imageRef = CGBitmapContextCreateImage(ctx);  
CGContextRelease(ctx);
UIImage *redImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

return redImage;

}


person Cyprian    schedule 24.11.2010    source источник
comment
Проблема решена. Проблем не было :-) Я получил 0 значений для RGB, потому что изображение состояло только из альфа-значений.   -  person Cyprian    schedule 24.11.2010


Ответы (1)


Итак, если у вас есть проблемы с манипулированием пикселями на растровом изображении, вы можете принять во внимание формат растровых изображений (32-битный? 16-битный?) ARGB, RGBA или CMYK

Совет. Если вы хотите проверить, в каком формате находится ваше растровое изображение, попробуйте указать 1 для первого байта, 0 для второго байта и 0 для третьего байта.

m_PixelBuf[i] = 1;
m_PixelBuf[i+1] = 0;  
m_PixelBuf[i+2] = 0;  

Таким образом, если все пиксели станут красными, вы знаете, что ваш формат — RGBA. Поиграйте с ним, и через несколько минут вы поймете это. Возможно, есть более простой способ, но я нуб :-)

В моем случае мое изображение было RGBA, но все пиксели хранились в альфа-битах, поскольку CGImageRef (inImage) был прозрачным с тенями в оттенках серого.

Заключение
Код правильный, но мои знания о формате входного растрового изображения были неверными.

person Cyprian    schedule 25.11.2010