2013-03-14 131 views
0

嘿,夥計們,我目前正在嘗試遍歷UIImage的所有像素,但我實現它的方式需要很多時間。所以我認爲這是我實施它的錯誤方式。 這是我的方法,我如何得到一個像素的RGBA值:如何遍歷UIImage的所有像素?

+(NSArray*)getRGBAsFromImage:(UIImage*)image atX:(int)xx andY:(int)yy count:(int)count 
{ 
    // Initializing the result array 
    NSMutableArray *result = [NSMutableArray arrayWithCapacity:count]; 

    // First get the image into your data buffer 
    CGImageRef imageRef = [image CGImage];      // creating an Instance of 
    NSUInteger width = CGImageGetWidth(imageRef);    // Get width of our Image 
    NSUInteger height = CGImageGetHeight(imageRef);    // Get height of our Image 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); // creating our colour Space 

    // Getting that raw Data out of an image 
    unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char)); 


    NSUInteger bytesPerPixel = 4;        // Bytes per pixel defined 
    NSUInteger bytesPerRow = bytesPerPixel * width;    // Bytes per row 
    NSUInteger bitsPerComponent = 8;       // Bytes per component 

    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); // releasing the color space 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    // Now your rawData contains the image data in the RGBA8888 pixel format. 
    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel; 
    for (int ii = 0 ; ii < count ; ++ii) 
    { 
     CGFloat red = (rawData[byteIndex]  * 1.0)/255.0; 
     CGFloat green = (rawData[byteIndex + 1] * 1.0)/255.0; 
     CGFloat blue = (rawData[byteIndex + 2] * 1.0)/255.0; 
     CGFloat alpha = (rawData[byteIndex + 3] * 1.0)/255.0; 
     byteIndex += 4; 

     UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
     [result addObject:acolor]; 
    } 

    free(rawData); 
    return result; 
} 

這是我的代碼通過所有的像素是如何解析:

有沒有讓所有的更快的方法uiimage實例的RGBA值?

回答

1

對於每個像素,您都會生成圖像的新副本,然後將其丟棄。是的,只需獲取一次數據然後在該字節數組上進行處理就會快得多。

但它很大程度上取決於「做其他事情」中的內容。有許多CoreImage和vImage函數可以非常快速地進行圖像處理,但是您可能需要以不同的方式處理問題。這取決於你在做什麼。