2016-01-14 68 views
-1

嘿,我有這個問題,需要一些幫助;這是我的代碼,但我不知道爲什麼當我點擊一個白色的顏色在視圖中發送給我黑色??? ???有些幫助?在Objective C問題中從UIImage獲取RGB值顏色

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 2) { 
     return; 
    } 
    self.imageTakenView.userInteractionEnabled = true; 
    CGPoint lastPoint = [touch locationInView:self.imageTakenView]; 
    NSLog(@"%f :: ", lastPoint.x); 
    NSLog(@"%f :: ", lastPoint.y); 
    UIColor *colorPickerColor; 
    colorPickerColor = [self getPixelColorAtLocation:lastPoint]; 

    self.colorPickerView.backgroundColor = colorPickerColor; 

} 
- (UIColor*) getPixelColorAtLocation:(CGPoint)point { 
    UIColor* color = nil; 
    CGImageRef inImage = self.imageTaken.CGImage; 
    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue 
    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage]; 
    if (cgctx == NULL) { return nil; /* error */ } 

    size_t w = CGImageGetWidth(inImage); 
    size_t h = CGImageGetHeight(inImage); 
    CGRect rect = {{0,0},{w,h}}; 

    // Draw the image to the bitmap context. Once we draw, the memory 
    // allocated for the context for rendering will then contain the 
    // raw image data in the specified color space. 
    CGContextDrawImage(cgctx, rect, inImage); 

    // Now we can get a pointer to the image data associated with the bitmap 
    // context. 
    unsigned char* data = CGBitmapContextGetData (cgctx); 
    if (data != NULL) { 
     //offset locates the pixel in the data from x,y. 
     //4 for 4 bytes of data per pixel, w is width of one row of data. 
     int offset = 4*((w*round(point.y))+round(point.x));  // 4 base 
     int alpha = data[offset]; 
     int red = data[offset+1]; 
     int green = data[offset+2]; 
     int blue = data[offset+3]; 
     NSLog(@"offset: %i colors: RGB A %i %i %i %i",offset,red,green,blue,alpha); 
     color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)]; 
    } 

    // When finished, release the context 
    CGContextRelease(cgctx); 
    // Free image data memory for the context 
    if (data) { free(data); } 

    return color; 
} 

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage { 

    CGContextRef context = NULL; 
    CGColorSpaceRef colorSpace; 
    void *   bitmapData; 
    unsigned long int    bitmapByteCount; 
    unsigned long int    bitmapBytesPerRow; 

    // Get image width, height. We'll use the entire image. 
    size_t pixelsWide = CGImageGetWidth(inImage); 
    size_t pixelsHigh = CGImageGetHeight(inImage); 

    // Declare the number of bytes per row. Each pixel in the bitmap in this 
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and 
    // alpha. 
    bitmapBytesPerRow = (pixelsWide * 4); 
    bitmapByteCount  = (bitmapBytesPerRow * pixelsHigh); 

    // Use the generic RGB color space. 
    colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
    if (colorSpace == NULL) 
    { 
     fprintf(stderr, "Error allocating color space\n"); 
     return NULL; 
    } 

    // Allocate memory for image data. This is the destination in memory 
    // where any drawing to the bitmap context will be rendered. 
    bitmapData = malloc(bitmapByteCount); 
    if (bitmapData == NULL) 
    { 
     fprintf (stderr, "Memory not allocated!"); 
     CGColorSpaceRelease(colorSpace); 
     return NULL; 
    } 

    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits 
    // per component. Regardless of what the source image format is 
    // (CMYK, Grayscale, and so on) it will be converted over to the format 
    // specified here by CGBitmapContextCreate. 
    context = CGBitmapContextCreate (bitmapData, 
            pixelsWide, 
            pixelsHigh, 
            8,  // bits per component 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaPremultipliedFirst); 
    if (context == NULL) 
    { 
     free (bitmapData); 
     fprintf (stderr, "Context not created!"); 
    } 

    // Make sure and release colorspace before returning 
    CGColorSpaceRelease(colorSpace); 

    return context; 
} 

enter image description here

在圖片中,在畫面的底部出現在視圖中的棕色顏色;這個顏色出現,當我點擊霧的圖片,所以我認爲,顏色必須是白色或灰色的種類,所以...我根本不明白...

截圖是使用iPhone 5S模擬器un xcode 7.2。

謝謝

+0

你會得到黑色,你點擊過哪裏?或者你在不同的地方得到不同的顏色? – Skywalker

+0

如果它的樣子,你沒有得到正確的顏色,這可能是因爲你的圖像的尺寸大於記錄觸摸的圖像視圖。所以,你映射到的位置是不一樣的,你碰touch .. – Skywalker

+0

我在不同的地方得到不同的顏色... –

回答

0

你應該讓你的圖像的縮放複印,大小相同的imageTakenView屬性,然後使用該副本來檢測顏色。這樣,您觸摸的點的映射將正確發生。

請參考此答案縮放圖像 - https://stackoverflow.com/a/2658801/5316422

請確保將圖像縮放到imageTakenView屬性的大小。