Беззнаковое распределение символов равно нулю в значении смещения цели c

Я получаю значения цвета пикселей из точек касания. Я успешно делаю это, но после того, как иногда приложение выдает ошибку ( EXC_BAD_ACCESS(CODE=1,address=0x41f6864). Его проблема выделения памяти здесь - исходный код для вашей справки.

- (UIColor *) getPixelColorAtLocation:(CGPoint)point {
UIColor* color = nil;

@try{

    {

    CGImageRef inImage =  drawImage.image.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 = {0};
       data=(unsigned char*) calloc(CGImageGetHeight(inImage) * CGImageGetWidth(inImage) , CGBitmapContextGetHeight(cgctx)*CGBitmapContextGetWidth(cgctx));

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));

           // NSLog(@"%s111111",data);

     int alpha =  data[offset]; /////// EXC_BAD_ACCESS(CODE=1,address=0x41f6864)           

    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
//CGImageRelease(*data);
CGContextRelease(cgctx);

// Free image data memory for the context
if (data)
{

 free(data);  
}
}
@catch (NSException *exception) {
}
return color;
}

2 ответа

Управление памятью в вашем коде выглядит неправильно:

декларировать data и бессмысленно присваивать ему значение:

unsigned char *data = {0};

Выделите блок памяти и сохраните ссылку на него в data - перезаписывает бессмысленную инициализацию:

data = (unsigned char *)calloc(CGImageGetHeight(inImage) * CGImageGetWidth(inImage), CGBitmapContextGetHeight(cgctx) * CGBitmapContextGetWidth(cgctx));

Теперь получите ссылку на другой блок памяти и сохраните его в dataвыкидываю ссылку на calloc'блок:

data = CGBitmapContextGetData (cgctx);

Сделайте что-нибудь еще и освободите блок, который вы не делали calloc:

free(data);

Если вы выделяете свой собственный буфер памяти, вы должны передать его CGBitmapContextCreateОднако при условии, что вы используете iOS 4+, нет необходимости выделять свой собственный буфер.

Что касается ошибки доступа к памяти, вы не проверяете значение point и ваш расчет будет производить значение offset что неверно. Добавить проверки на значения point а также offset и принять соответствующие меры, если они выходят за пределы (вам придется решить, что это должно быть).

НТН

Проблема может быть вызвана point вне изображения rectтак что вы можете использовать

try{

    int offset = 4*((w*round(point.y))+round(point.x));
    int alpha =  data[offset];       
    int red = data[offset+1];
    int green = data[offset+2];
    int blue = data[offset+3];



    color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f)
         alpha:(alpha/255.0f)];

}catch(NSException e){

}

чтобы избежать EXC_BAD_ACCESS

Другие вопросы по тегам