开发者

Get pixels value from png file. which is right & why?

I need pixel value from png file. so I searched SO and got two methods as follows:

Method 1

- (void)GeneratePixelArray {

    UIImage *cImage = [UIImage imageNamed:@"ball.png"];
    int width = (int)cImage.size.width;
    int heig开发者_StackOverflow社区ht = (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);
}

Method 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;
}

I logged output using:

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

Method 1 and Method 2 logs differ! Why? I am confused.

Thanks a lot!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜