2010-09-22 66 views

Trả lời

25

Thể loại này trên UIImage có thể hữu ích 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

Bạn có thể đặt png vào chế độ xem hình ảnh và sau đó sử dụng this method để lấy giá trị pixel từ ngữ cảnh đồ họa mà bạn sẽ vẽ hình ảnh vào.

1

Cách tiếp cận trực tiếp là hơi tẻ nhạt, nhưng ở đây đi:

  1. Lấy hình ảnh CoreGraphics.

    CGImageRef cgImage = image.CGImage;

  2. Lấy "cung cấp dữ liệu", và từ đó lấy dữ liệu. NSData * d = [(id)CGDataProviderCopyData(CGImageGetDataProvider(cgImage)) autorelease];

  3. Hình ra những định dạng dữ liệu là trong

    CGImageGetBitmapInfo().

    CGImageGetBitsPerComponent();

    CGImageGetBitsPerPixel();

    CGImageGetBytesPerRow();

  4. tìm ra không gian màu (PNG hỗ trợ greyscale/RGB/paletted).

    CGImageGetColorSpace()

Phương pháp gián tiếp là để vẽ các hình ảnh vào một ngữ cảnh (lưu ý rằng bạn có thể cần phải xác định thứ tự byte của bối cảnh nếu bạn muốn bất kỳ bảo lãnh) và đọc các byte ra.
Nếu bạn chỉ muốn các pixel đơn lẻ, có thể nhanh hơn để vẽ hình ảnh đến ngữ cảnh 1x1 với đúng rect
(giống như (CGRect){{-x,-y},{imgWidth,imgHeight}}).
Điều này sẽ xử lý chuyển đổi không gian màu cho bạn. Nếu bạn chỉ muốn có giá trị độ sáng, hãy sử dụng ngữ cảnh màu xám.

Các vấn đề liên quan