2017-11-17 36 views
0

UIImageViewがあり、UIColor orangeColorを使用して描画します。さて、私はタップされたピクセルのpixelColorを検出するはずの関数を持っています。描画時の色の不一致

R:1.000000 G:0.501961 B:0.000000 UIOrange

それがなければならないためpixelColorを検出しようとするとき、私は受信RGB値だ

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で浮動小数点数を使ってオレンジを作成すると、R:255、G:128、B:0 A:255に切り捨てられます。これをフロートとして読むと、1.0が得られます。0.501961 B:0.0 A:1.0

+0

プライマリとセカンダリの色の多くが2のファクタから構築されるので、定数分母として256.0を使用する方が良いでしょうか? –

+0

いいえ。 255はUInt8の正しい最大値です。丸めを本当に気にしたら、すべての色をバイト単位で指定してください。変換や精度の低下はありません。ディスプレイP3でワイドカラーを使用している場合は、浮動小数点数が必要です。 –

+0

Josh Homann:私が見ることができるように、バイトで動作するように私の機能を更新することはできますか? – digit