2010-09-22 13 views

Respuesta

25

Esta categoría en UIImage podría ser útil Source

#import <CoreGraphics/CoreGraphics.h> 

#import "UIImage+ColorAtPixel.h" 

@implementation UIImage (ColorAtPixel) 

- (UIColor *)colorAtPixel:(CGPoint)point { 
    // Cancel if point is outside image coordinates 
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) { 
     return nil; 
    } 


    // Create a 1x1 pixel byte array and bitmap context to draw the pixel into. 
    // Reference: http://stackoverflow.com/questions/1042830/retrieving-a-pixel-alpha-value-for-a-uiimage 
    NSInteger pointX = trunc(point.x); 
    NSInteger pointY = trunc(point.y); 
    CGImageRef cgImage = self.CGImage; 
    NSUInteger width = CGImageGetWidth(cgImage); 
    NSUInteger height = CGImageGetHeight(cgImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    int bytesPerPixel = 4; 
    int bytesPerRow = bytesPerPixel * 1; 
    NSUInteger bitsPerComponent = 8; 
    unsigned char pixelData[4] = { 0, 0, 0, 0 }; 
    CGContextRef context = CGBitmapContextCreate(pixelData, 
               1, 
               1, 
               bitsPerComponent, 
               bytesPerRow, 
               colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextSetBlendMode(context, kCGBlendModeCopy); 

    // Draw the pixel we are interested in onto the bitmap context 
    CGContextTranslateCTM(context, -pointX, -pointY); 
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); 
    CGContextRelease(context); 

    // Convert color values [0..255] to floats [0.0..1.0] 
    CGFloat red = (CGFloat)pixelData[0]/255.0f; 
    CGFloat green = (CGFloat)pixelData[1]/255.0f; 
    CGFloat blue = (CGFloat)pixelData[2]/255.0f; 
    CGFloat alpha = (CGFloat)pixelData[3]/255.0f; 
    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 
} 

@end 
4

Puede poner el png en una vista de imagen y luego usar this method para obtener el valor de píxel de un contexto gráfico en el que dibujaría la imagen.

1

El enfoque directo es ligeramente tedioso, pero aquí va:

  1. obtener una imagen del CoreGraphics.

    CGImageRef cgImage = image.CGImage;

  2. obtener el "proveedor de datos", ya partir de ese Obtener los datos. NSData * d = [(id)CGDataProviderCopyData(CGImageGetDataProvider(cgImage)) autorelease];

  3. averiguar qué formato a los datos está en

    CGImageGetBitmapInfo().;

    CGImageGetBitsPerComponent();

    CGImageGetBitsPerPixel();

    CGImageGetBytesPerRow();

  4. descifrar el espacio de color (PNG admite escala de grises/RGB/paletizado).

    CGImageGetColorSpace()

El enfoque indirecto es dibujar la imagen en un contexto (tenga en cuenta que puede ser necesario especificar el orden de bytes del contexto si quieres ninguna garantía) y leer los bytes a cabo.
Si solo desea píxeles individuales, podría ser más rápido dibujar la imagen en un contexto de 1x1 con el rect derecho
(algo así como (CGRect){{-x,-y},{imgWidth,imgHeight}}).
Esto manejará la conversión de espacio de color para usted. Si solo quiere un valor de brillo, use un contexto de escala de grises.

Cuestiones relacionadas