Ios 从png文件中获取像素值。哪个是对的&;为什么?

Ios 从png文件中获取像素值。哪个是对的&;为什么?,ios,png,pixels,Ios,Png,Pixels,我需要从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 *)m

我需要从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);
}
方法1和方法2日志不同!为什么?我很困惑


非常感谢

@user6748724,请更新标签以包含“iOS”或“objective-c”,以更合适的标签为准。谢谢。您的项目中有高分辨率版本的图像吗?它将被命名为
ball@2x.png
。这两种方法都会严重泄漏。。。方法1中的cMap(甚至没有使用)和方法2中的bitmapData。这两个变量都是局部变量,但从未发布过。
- (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);