2013-06-22 3 views
2

Я хочу конвертировать UIImage в 8 бит. Я попытался сделать это, но я не уверен, что я сделал это правильно, потому что позже получаю сообщение, когда пытаюсь использовать библиотеку обработки изображений leptonica, которая заявляет, что это не 8 бит. Может ли кто-нибудь сказать мне, правильно ли я это делаю или код о том, как это сделать?Convert UIImage to 8 bits

Спасибо!

КОД

CGImageRef myCGImage = image.CGImage; 
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(myCGImage)); 
const UInt8 *imageData = CFDataGetBytePtr(data); 
+0

Посмотрите на [это] (http://stackoverflow.com/questions/6073259/getting-rgb-pixel-data-from-cgimage), чтобы получить доступ к необработанным данным пикселя Вам нужно сделать преобразование в 8-битный. Это довольно просто, если формат известен заранее, например. для RGBA просто найдите среднее значение каналов R, G, B. –

+0

Думаю, он имеет в виду оттенки серого. Лептоника - библиотека обработки изображений. Большинство библиотек обработки изображений работают с изображениями в оттенках серого. –

ответ

6

После код будет работать для изображений без альфа-канала:

CGImageRef c = [[UIImage imageNamed:@"100_3077"] CGImage]; 

    size_t bitsPerPixel = CGImageGetBitsPerPixel(c); 
    size_t bitsPerComponent = CGImageGetBitsPerComponent(c); 
    size_t width = CGImageGetWidth(c); 
    size_t height = CGImageGetHeight(c); 

    CGImageAlphaInfo a = CGImageGetAlphaInfo(c); 

    NSAssert(bitsPerPixel == 32 && bitsPerComponent == 8 && a == kCGImageAlphaNoneSkipLast, @"unsupported image type supplied"); 

    CGContextRef targetImage = CGBitmapContextCreate(NULL, width, height, 8, 1 * CGImageGetWidth(c), CGColorSpaceCreateDeviceGray(), kCGImageAlphaNone); 

    UInt32 *sourceData = (UInt32*)[((__bridge_transfer NSData*) CGDataProviderCopyData(CGImageGetDataProvider(c))) bytes]; 
    UInt32 *sourceDataPtr; 

    UInt8 *targetData = CGBitmapContextGetData(targetImage); 

    UInt8 r,g,b; 
    uint offset; 
    for (uint y = 0; y < height; y++) 
    { 
     for (uint x = 0; x < width; x++) 
     { 
      offset = y * width + x; 

      if (offset+2 < width * height) 
      { 
       sourceDataPtr = &sourceData[y * width + x]; 

       r = sourceDataPtr[0+0]; 
       g = sourceDataPtr[0+1]; 
       b = sourceDataPtr[0+2]; 

       targetData[y * width + x] = (r+g+b)/3; 
      } 
     } 
    } 

    CGImageRef newImageRef = CGBitmapContextCreateImage(targetImage); 
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

    CGContextRelease(targetImage); 
    CGImageRelease(newImageRef); 

С помощью этого кода я преобразовал RgB изображение в черно-белое изображение: Original image Grayscale image

Надеюсь, это поможет

+0

Я пробовал это с http://asia.olympus-imaging.com/products/dslr/e510/sample/images/sample_03.jpg, и он получил нарушение прав доступа на очень нижней части изображения. – tia

+0

Хм, я попробовал это с изображением, которое вы отправили, и я получил ту же ошибку. Кажется, что что-то похоже на последний пиксель ... Я обновил код, поэтому мы не можем иссякнуть из границ изображения. – Lukas