Получить значение пикселей из файла PNG.что правильно и почему? - PullRequest
1 голос
/ 27 марта 2011

Мне нужно значение пикселя из png файла. поэтому я искал SO и получил два метода следующим образом:

Метод 1

- (void)GeneratePixelArray {

    UIImage *cImage = [UIImage imageNamed:@"ball.png"];
    int width = (int)cImage.size.width;
    int height = (int)cImage.size.height;

    unsigned char *cMap = (unsigned char *)malloc(width * height);
    memset(cMap, 0, width * height);

    CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(cImage.CGImage));
    const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);

    //0xff 0x00 is guard for this demo
    for (int j = 0; j < (width * height); j++)
    {
        printf("0x%x\n", (unsigned int)pixels[j]);
    }
    CFRelease(imageData);
}

Метод 2

- (void *)GeneratePixelArray//: (UIImage *) image
{
    UIImage *cImage = [[UIImage alloc] imageNamed:@"ball.png"];
    //UIImage *cImage = [UIImage imageNamed:@"ball.png"];
    int pixelsWidth = (int)cImage.size.width;
    int pixelsHeight = (int)cImage.size.height;
    CGRect rect = {{0,0}, {pixelsWidth, pixelsHeight}};

    // Use RCG color space without Alpha, just RGB
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();   
    if(colorSpace == NULL)
    {
        NSLog(@"Error allocating color space! \n");
        return NULL;
    }
    unsigned int bitmapBytesPerRow = pixelsWidth*4;
    unsigned int bitmapByteCount = bitmapBytesPerRow*pixelsHeight;
    void * bitmapData = malloc(bitmapByteCount);
    if (bitmapData == NULL) {
        NSLog(@"Memory not allocated!\n");
        CGColorSpaceRelease(colorSpace);
        return NULL;
    }
    // create bitmap context ,8 bits per component
    CGContextRef context = CGBitmapContextCreate(bitmapData,
                                                 pixelsWidth,
                                                 pixelsHeight,
                                                 8,//bits per component
                                                 bitmapBytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast);

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

    if (context == NULL)
    {
        free(bitmapData);
        NSLog(@"Context not be created!");
        return NULL;
    }


    // Draw the image to the bitmap context
    CGContextDrawImage(context, rect, cImage.CGImage);

    // Now we can get a pointer to the image data associated with context
    unsigned char *bitsData;
    bitsData = CGBitmapContextGetData(context);
    if (!bitsData)
    {
        NSLog(@"Failed");


        return;

   }
    void *data = CGBitmapContextGetData(context);
    unsigned char* bitmapData2 = malloc(bitmapByteCount);
    if (bitmapData2 == NULL)
    {
        NSLog(@"Memory not be allocated!\n");
        return NULL;
    }
    unsigned char* rcdata = (unsigned char *)data;
    unsigned char* wcdata = bitmapData2;


    // remove ARGB's fourth value, it is Alpha
    for (int i = 0; i < bitmapByteCount / 4; ++i, rcdata += 4)
    {
        printf("%x\n", (unsigned int)*(unsigned int*)rcdata);
        *(wcdata + 0) = *(rcdata + 0);
        *(wcdata + 1) = *(rcdata + 1);
        *(wcdata + 2) = *(rcdata + 2);
        *(wcdata + 3) = *(rcdata + 3);
        if (*(wcdata+3)<20) {
            printf("alpha...\n");
        }
        //        if ( (*(wcdata + 0)==255) &&(*(wcdata + 1)==0) && (*(wcdata + 2)==0) ) {
        //            printf("red\n");
        //        }
        wcdata += 4;// skip alpha
    }
    CGContextRelease(context);
    return bitsData;
}

Я зарегистрировал вывод, используя:

printf("%x\n", (unsigned int)*(unsigned int*)rcdata);

Методы 1 и 2 отличаются! Зачем? Я в замешательстве.

Большое спасибо!

...