2017-11-17 122 views
0

我有一個UIImageView,並使用UIColor orangeColor繪製它。現在,我有一個功能,應該檢測點擊像素的pixelColor。繪畫時顏色不一致

R:1.000000 G:0.501961 B:0.000000

這是RGB值試圖檢測的pixelColor爲UIOrange

它應該是當我收到。

R:1.000000 G:0.5 B:0.000000

這裏是我的功能

- (UIColor *)colorAtPixel:(CGPoint)point { 
    // Cancel if point is outside image coordinates 
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, _overlay_imageView.frame.size.width, _overlay_imageView.frame.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 = _overlay_imageView.image.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]; 
} 

任何想法?

我必須提到,我的UIImageView有一個clearBackground,它的ontop是一個黑色的畫布。這可能是問題嗎?

+0

我不知道你在這裏要求什麼類型的幫助。你可以更具體地瞭解這是一個問題嗎? –

+0

是的,我需要比較顏色值與UIColor colornameColor來查看我是否匹配正確的像素。 – digit

回答

1

你的功能沒有問題。這是浮點數學的結果。整數255(無符號字節的最大值)中的一半是127/255.0或128/255.0,具體取決於您如何舍入。這兩者都不是0.5。他們分別是0.498039215686275和0.501960784313725。

編輯:我想我應該補充一點,在CGImage中的顏色存儲爲字節,而不是浮動。所以當你用UIColor中的float創建橙色時,它會被截斷爲R:255,G:128,B:0 A:255。當你讀回來作爲浮點數得到1.0 0.501961乙:0.0答:1.0

+0

因爲很多主要和次要的顏色是由兩個因子構建的,所以使用256.0作爲常量分母會更好嗎? –

+0

否; 255是UInt8的正確最大值。如果你真的關心四捨五入,那麼只需以字節爲單位指定所有顏色,並且不會有任何轉換或精度損失。如果您在顯示屏P3上使用寬色,則只需要浮點數。 –

+0

Josh Homann:你能否更新我的函數來處理字節,這樣我就可以看到了? – digit