2013-03-31 6 views
0

je le code suivant qui tente de tester chaque pixel dans un rectangle de pixelsQuel est le moyen le plus efficace de saisir un rectangle de pixels dans ios?

px, py = Emplacement du toucher
dx, dy = Taille du rectangle à tester

UIImage *myImage; // image from which pixels are read 
int ux = px + dx; 
int uy = py + dy; 
for (int x = (px-dx); x <= ux; ++x) 
{ 
    for (int y = (py-dy); y <= uy; ++y) 
    { 
     unsigned char pixelData[] = { 0, 0, 0, 0 }; 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
     CGImageRef cgimage = myImage.CGImage; 
     int imageWidth = CGImageGetWidth(cgimage); 
     int imageHeight = CGImageGetHeight(cgimage); 
     CGContextDrawImage(context, CGRectMake(-px, py - imageHeight, imageWidth, imageHeight), cgimage); 
     CGColorSpaceRelease(colorSpace); 
     CGContextRelease(context); 

     // Here I have latest pixel, with RBG values stored in pixelData that I can test 
    } 
} 

Le le code dans la boucle interne saisit le pixel à l'emplacement x, y. Existe-t-il un moyen plus efficace d'extraire tout le rectangle de pixels (x-dx, y-dy), (x + dx, y + dy) de l'UIImage (myImage)?

Répondre

0

Wow, votre réponse est simple.

Le problème est que vous créez un nouveau contexte bitmap pour chaque pixel que vous numérisez. Créer un seul contexte bitmap est coûteux, et le faire des milliers de fois de suite est vraiment mauvais pour la performance. Créez simplement un seul contexte de bitmap (avec un objet de données personnalisé), puis analysez-le à l'aide de ces données. Ce sera beaucoup plus rapide.

UIImage *myImage; // image from which pixels are read 
CGSize imageSize = [myImage size];  

NSUInteger bytesPerPixel = 4; 
NSUInteger bytesPerRow = bytesPerPixel * imageSize.width; 
NSUInteger bitsPerComponent = 8; 

unsigned char *pixelData = (unsigned char*) calloc(imageSize.height * imageSize.width * bytesPerPixel, sizeof(unsigned char)) 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(pixelData, imageSize.width, 1imageSize.height bitsPerComponent, bytesPerPixel, colorSpace, kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(context, CGRectMake(0, 0, imageSize.width, imageSize.height), myImage.CGImage); 

// you can tweak these 2 for-loops to get whichever section of pixels from the image you want for reading. 

for (NSInteger x = 0; x < imageSize.width; x++) { 

    for (NSInteger y = 0; y < imageSize.height; y++) { 

     int pixelIndex = (bytesPerRow * yy) + xx * bytesPerPixel; 

     CGFloat red = (pixelData[pixelIndex]  * 1.0)/255.0; 
     CGFloat green = (pixelData[pixelIndex + 1] * 1.0)/255.0; 
     CGFloat blue = (pixelData[pixelIndex + 2] * 1.0)/255.0; 
     CGFloat alpha = (pixelData[pixelIndex + 3] * 1.0)/255.0; 
     pixelIndex += 4; 

     UIColor *yourPixelColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 

    } 
    } 
} 

// be a good memory citizen 
CGColorSpaceRelease(colorSpace); 
CGContextRelease(context); 
free(pixelData); 
+0

Merci pour les réponses et les explications, mais je ne vois pas d'endroit où vous écrivez l'image dans le contexte? –

+0

Oh ouais, désolé à ce sujet. C'est corrigé maintenant. –

Questions connexes