2010-11-24 2 views
2

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

-(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; 

}

+0

Проблема решена. Не было никаких проблем :-) Я получил 0 значений для RGB, потому что изображение было сделано только из значений Alpha. – Cyprian 2010-11-24 16:01:28

ответ

1

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

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

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

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

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

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

Смежные вопросы