2011-01-07 15 views
7

Stavo sviluppando un'applicazione che modifica l'immagine a colori in un'immagine grigia. Tuttavia, alcuni come l'immagine viene fuori sbagliato. Non so cosa c'è di sbagliato nel codice. forse il parametro che ho inserito è sbagliato, per favore aiuto.Modifica dell'immagine a colori RGB in scala di grigi usando l'obiettivo C

UIImage *c = [UIImage imageNamed:@"downRed.png"]; 
CGImageRef cRef = CGImageRetain(c.CGImage); 

NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(cRef)); 

size_t w = CGImageGetWidth(cRef); 
size_t h = CGImageGetHeight(cRef); 

unsigned char* pixelBytes = (unsigned char *)[pixelData bytes]; 

unsigned char* greyPixelData = (unsigned char*) malloc(w*h); 

for (int y = 0; y < h; y++) { 
for(int x = 0; x < w; x++){ 

int iter = 4*(w*y+x); 
int red = pixe lBytes[iter]; 
int green = pixelBytes[iter+1]; 
int blue = pixelBytes[iter+2]; 
greyPixelData[w*y+x] = (unsigned char)(red*0.3 + green*0.59+ blue*0.11); 
    int value = greyPixelData[w*y+x]; 

} 
} 

CFDataRef imgData = CFDataCreate(NULL, greyPixelData, w*h); 


CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(imgData); 


size_t width = CGImageGetWidth(cRef); 
size_t height = CGImageGetHeight(cRef); 
size_t bitsPerComponent = 8; 
size_t bitsPerPixel = 8; 
size_t bytesPerRow = CGImageGetWidth(cRef); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
CGBitmapInfo info = kCGImageAlphaNone; 
CGFloat *decode = NULL; 
BOOL shouldInteroplate = NO; 
CGColorRenderingIntent intent = kCGRenderingIntentDefault; 
    CGDataProviderRelease(imgDataProvider); 

CGImageRef throughCGImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, info, imgDataProvider, decode, shouldInteroplate, intent); 


UIImage* newImage = [UIImage imageWithCGImage:throughCGImage]; 

CGImageRelease(throughCGImage); 
newImageView.image = newImage; 
+0

Ecco un filo simile che potrebbe aiutarti : http://stackoverflow.com/questions/4030430/iphone-convert-color-image-to-2bit-image-black-white –

+0

Qual è l'errore che stai ottenendo? inoltre, utilizzare la selezione '{}' per formattare il codice in futuro. – KevinDTimm

+0

Grazie per il link. Comunque non mi ha aiutato (non ho alcun errore ma l'immagine è strana, sembra stigmatizzata –

risposta

4

Basta usare questo:

- (UIImage *)convertImageToGrayScale:(UIImage *)image 
{ 
    // Create image rectangle with current image width/height 
    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 

    // Grayscale color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    // Create bitmap content with current image size and grayscale colorspace 
    CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); 

    // Draw image into current context, with specified rectangle 
    // using previously defined context (with grayscale colorspace) 
    CGContextDrawImage(context, imageRect, [image CGImage]); 

    // Create bitmap image info from pixel data in current context 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 

    // Create a new UIImage object 
    UIImage *newImage = [UIImage imageWithCGImage:imageRef]; 

    // Release colorspace, context and bitmap information 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 
    CFRelease(imageRef); 

    // Return the new grayscale image 
    return newImage; 
} 
19

Se qualcuno vuole grigio immagini in scala che contengono parti trasparenti la soluzione offerta da digipeople avrà una maschera nera intorno ad esso. Usa questo invece di lasciare il trasparente così com'è.

- (UIImage *)imageToGreyImage:(UIImage *)image { 
    // Create image rectangle with current image width/height 
    CGFloat actualWidth = image.size.width; 
    CGFloat actualHeight = image.size.height; 

    CGRect imageRect = CGRectMake(0, 0, actualWidth, actualHeight); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 

    CGContextRef context = CGBitmapContextCreate(nil, actualWidth, actualHeight, 8, 0, colorSpace, kCGImageAlphaNone); 
    CGContextDrawImage(context, imageRect, [image CGImage]); 

    CGImageRef grayImage = CGBitmapContextCreateImage(context); 
    CGColorSpaceRelease(colorSpace); 
    CGContextRelease(context); 

    context = CGBitmapContextCreate(nil, actualWidth, actualHeight, 8, 0, nil, kCGImageAlphaOnly); 
    CGContextDrawImage(context, imageRect, [image CGImage]); 
    CGImageRef mask = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 

    UIImage *grayScaleImage = [UIImage imageWithCGImage:CGImageCreateWithMask(grayImage, mask) scale:image.scale orientation:image.imageOrientation]; 
    CGImageRelease(grayImage); 
    CGImageRelease(mask); 

    // Return the new grayscale image 
    return grayScaleImage; 
} 
+0

@YoundukNam Se questo ha risposto alla tua domanda , dovresti accettarlo. Ha funzionato benissimo per me! – PickYourPoison

0

versione Swift, testato e funzionante al 100%:

func imageToGreyImage(image: UIImage) -> UIImage { 

    // Create image rectangle with current image width/height 
    var actualWidth = image.size.width; 
    var actualHeight = image.size.height; 

    var imageRect = CGRectMake(0, 0, actualWidth, actualHeight); 
    var colorSpace = CGColorSpaceCreateDeviceGray(); 

    var bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.None.rawValue) 

    var context = CGBitmapContextCreate(nil, Int(actualWidth), Int(actualHeight), 8, 0, colorSpace, bitmapInfo); 
    CGContextDrawImage(context, imageRect, image.CGImage); 

    var grayImage = CGBitmapContextCreateImage(context); 
    bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.Only.rawValue) 
    context = CGBitmapContextCreate(nil, Int(actualWidth), Int(actualHeight), 8, 0, nil, bitmapInfo); 
    CGContextDrawImage(context, imageRect, image.CGImage); 
    var mask = CGBitmapContextCreateImage(context); 

    var grayScaleImage = UIImage(CGImage: CGImageCreateWithMask(grayImage, mask), scale: image.scale, orientation: image.imageOrientation) 

    // Return the new grayscale image 
    return grayScaleImage!; 
} 

E se volete non alpha basta cancellare la riga seguente:

bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.Only.rawValue) 
+0

Come si chiama CGImageCreateWithMask in Swift 3? Ho convertito il resto ma sto lottando con quella funzione. – Jeremiah

Problemi correlati