2010-10-27 11 views
2

J'ai besoin d'aide pour convertir une image couleur en "noir et blanc", pas en niveaux de gris.Iphone convertir l'image couleur en image 2 bits (noir et blanc)

Je ne sais quoi faire avec l'iPhone SDK et Core Graphics, car je suis convaincu que c'est possible.

+0

Le noir et blanc ne serait-il pas une image 1 bit plutôt que 2? 2 bits vous offriraient quatre couleurs différentes. –

Répondre

3

Ceci est possible et j'ai essayé précédemment deux chemins:

  1. Convertir en Niveaux de gris puis appliquez pixel par conversion de pixels à B & W.
    --Problem c'est que je ne reçois pas de bons résultats avec des images avec transparence. Si vous n'êtes pas très strict, compte tenu d'une image RGBA, obtenez la moyenne en pixels RVB et convertissez en B & W avec un seuil fourni et gardez sa transparence. Techniquement c'est encore RGBA mais plus de Noir, Blanc et Transparence.

par exemple.

UIImage *originalImage = [UIImage imageNamed:@"option_bluetooth.png"]; 

    unsigned char *pixelBuffer = [self getPixelData:originalImage.CGImage]; 
    size_t length = originalImage.size.width * originalImage.size.height * 4; 
    CGFloat intensity; 
    int bw; 
    //50% threshold 
    const CGFloat THRESHOLD = 0.5; 
    for (int index = 0; index < length; index += 4) 
    { 
    intensity = (pixelBuffer[index] + pixelBuffer[index + 1] + pixelBuffer[index + 2])/3./255.; 
    if (intensity > THRESHOLD) { 
     bw = 255; 
    } else { 
     bw = 0; 
    } 
    pixelBuffer[index] = bw; 


    pixelBuffer[index + 1] = bw; 
    pixelBuffer[index + 2] = bw; 
    } 

    CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bitmapContext=CGBitmapContextCreate(pixelBuffer, originalImage.size.width, originalImage.size.height, 8, 4*originalImage.size.width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); 
    CFRelease(colorSpace); 
    free(pixelBuffer); 
    CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext); 
    CGContextRelease(bitmapContext); 

    UIImage *bwImage = [UIImage imageWithCGImage:cgImage]; 

Je reçois les données de pixels en écrivant à un contexte offscreen (la nouvelle façon d'obtenir les données brutes dont Apple suggère ne fonctionne pas pour moi)

par exemple

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    unsigned char *rawData = malloc(imageHeight * imageWidth * 4); 
    CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight, 
                 bitsPerComponent, bytesPerRow, colorSpace, 
                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); 

    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped); 
    CGContextRelease(offscreenContext); 

Voici le code pour obtenir des données Pixel

+ (unsigned char *) getPixelData: (CGImageRef) cgCropped { 

    size_t imageWidth = CGImageGetWidth(cgCropped); 

    size_t imageHeight = CGImageGetHeight(cgCropped); 
    size_t bitsPerComponent = 8; 
    size_t bytesPerPixel = 4; 
    size_t bytesPerRow = bytesPerPixel * imageWidth; 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    unsigned char *rawData = malloc(imageHeight * imageWidth * 4); 
    CGContextRef offscreenContext = CGBitmapContextCreate(rawData, imageWidth, imageHeight, 
                 bitsPerComponent, bytesPerRow, colorSpace, 
                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); 

    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(offscreenContext, CGRectMake(0, 0, imageWidth, imageHeight), cgCropped); 
    CGContextRelease(offscreenContext); 

    return rawData; 
} 
+0

Merci .. Va essayer cela ... – DeChinees

+0

Salut Manny, j'ai essayé cette réponse, je reçois erreur comme "l'utilisation de l'identificateur non déclaré GraphicsUtils" Quels sont les paquets nécessaires à l'importation .. S'il vous plaît Guide moi .. J'ai besoin de cela Merci à l'avance – Babul

+0

Salut, GraphicUtils est un utilitaire personnalisé, il devrait être facile d'obtenir des données de pixels juste chercher sur le net pour la solution. – Manny

0

Je pensais que je voudrais juste jeter là-bas que si vous ne voulez pas le seuil de l'image, le code ressemblerait ==>

intensity = (pixelBuffer[index] + pixelBuffer[index + 1] + pixelBuffer[index + 2])/3.0; 

pixelBuffer[index] = (int)intensity; 
pixelBuffer[index + 1] = (int)intensity; 
pixelBuffer[index + 2] = (int)intensity;