2013-06-22 4 views
2

Je souhaite convertir un format UII en 8 bits. J'ai essayé de faire ceci mais je ne suis pas sûr si je l'ai fait juste parce que j'obtiens un message plus tard quand j'essaye d'employer le leptonica de traitement d'image qui indique qu'il n'est pas 8 bits. Quelqu'un peut-il me dire si je fais cela correctement ou le code sur la façon de le faire?Convertir UIImage en 8 bits

Merci!

CODE

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

Jetez un oeil à [this] (http://stackoverflow.com/questions/6073259/getting-rgb-pixel-data-from-cgimage) pour avoir accès aux données de pixel brutes Vous devez faire la conversion en 8 bits. C'est assez simple si le format est connu à l'avance, par ex. pour RGBA il suffit de trouver la moyenne des canaux R, G, B. –

+0

Je pense qu'il veut dire en niveaux de gris. Leptonica est une bibliothèque de traitement d'image. La plupart des bibliothèques de traitement d'images fonctionnent avec des images en niveaux de gris. –

Répondre

6

code suivant fonctionnera pour des images sans canal alpha:

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

Avec ce code, je converti une image rgb à une image en niveaux de gris: Original image Grayscale image

Espérons que cela aide

+0

J'ai essayé ceci avec http://asia.olympus-imaging.com/products/dslr/e510/sample/images/sample_03.jpg et il y a eu violation d'accès à la partie inférieure de l'image. – tia

+0

Hm, j'ai essayé avec l'image que vous avez posté et j'ai eu la même erreur. Quelque chose semble être différent avec le dernier pixel ... J'ai mis à jour le code, donc nous ne pouvons pas manquer les limites de l'image. – Lukas

Questions connexes