2010-09-22 9 views

risposta

25

questa categoria su UIImage potrebbe essere utile 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

È possibile inserire il png in una vista immagine e quindi utilizzare this method per ottenere il valore del pixel da un contesto grafico in cui si desidera disegnare l'immagine.

1

L'approccio diretto è leggermente noioso, ma qui va:

  1. ottenere l'immagine del CoreGraphics.

    CGImageRef cgImage = image.CGImage;

  2. ottenere il "fornitore di dati", e da quel ottenere i dati. NSData * d = [(id)CGDataProviderCopyData(CGImageGetDataProvider(cgImage)) autorelease];

  3. Figura cosa formattare i dati sono in

    CGImageGetBitmapInfo().;

    CGImageGetBitsPerComponent();

    CGImageGetBitsPerPixel();

    CGImageGetBytesPerRow();

  4. calcolare lo spazio colore (PNG supporta scala di grigi/RGB/tavolozza).

    CGImageGetColorSpace()

L'approccio indiretto è quello di richiamare l'immagine in un contesto (si noti che potrebbe essere necessario specificare l'ordine dei byte del contesto se si desidera alcuna garanzia) e leggere i byte fuori.
Se si desidera solo pixel singoli, potrebbe essere più veloce disegnare l'immagine in un contesto 1x1 con il diritto rect
(qualcosa come (CGRect){{-x,-y},{imgWidth,imgHeight}}).
Questo gestirà la conversione dello spazio colore per te. Se si desidera solo un valore di luminosità, utilizzare un contesto in scala di grigi.

Problemi correlati