-1

Hey I have this issue and want some help; this is my code but I don't know why when I click in a white color the color in the view sends me black one???... some help?

- (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

In the picture, at the bottom of the picture appears a brown color in view; this color appears when I clicked in the fog's picture so I thought that color must be kind of white or grey so... I don't understand at all...

The screenshot was taken using iPhone 5S simulator un xcode 7.2.

Thank you

Hugo_hutch
  • 57
  • 11
  • do you get black color, where ever you click? or do you get different colors at different places? – Skywalker Jan 14 '16 at 07:04
  • if its like, you dont get correct color, it might be because your image has larger size than the imageview where the touch is recorded. so, the location you map to is not the same as the one you touch at.. – Skywalker Jan 14 '16 at 07:08
  • I get different colors at different places... – Hugo_hutch Jan 14 '16 at 07:32
  • Meharoof Najeeb how can I solved it? how can I set properly my UIIMage inside ImageView to solve the error? – Hugo_hutch Jan 14 '16 at 07:33

1 Answers1

0

You should make a scaled copy of your image with size same as that of your imageTakenView property and then use that copy to detect the color. This way, the mapping of the point you touch will happen correctly.

Refer this answer for scaling images - https://stackoverflow.com/a/2658801/5316422.

Make sure you scale the image to the size of your imageTakenView property.

Community
  • 1
  • 1
Skywalker
  • 1,590
  • 1
  • 18
  • 36