iPhone差异处理设备和模拟器之间的图像

时间:2012-11-08 13:37:02

标签: iphone ios uiimage ios-simulator cgcontext

我有一个带透明边框的图像,我正在尝试直接操作图像像素,遵循找到的Apple指南here。在设备上运行时,一切都运行良好。但是,当我在模拟器上运行我的代码时,我发现每次调用此函数时图像的透明边框会慢慢变黑。奇怪的是,即使我不修改图像数据,每次调用此函数时,透明边框仍然会变黑。例如,即使我的图像处理代码调用CGBitmapContextGetData但未使用返回的数据指针,我也会看到同样的问题。为了使问题在模拟器上消失,我必须注释掉对CGBitmapContextGetData的调用(当然是释放数据指针)。仍然在模拟器上修改图像的示例代码:

+ (UIImage *) updateImage:(UIImage *)inputImage
{
    UIImage *updatedImage;

    /* Update colors in image appropriately */
    CGImageRef image = [inputImage CGImage];

    CGContextRef cgctx = [ColorHandler CreateARGBBitmapContext:image];
    if (cgctx == NULL)
    {
        // error creating context
        NSLog(@"Error creating context.\n");
        return nil;
    }

    size_t w = CGImageGetWidth(image);
    size_t h = CGImageGetHeight(image);
    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, image);

    // Now we can get a pointer to the image data associated with the bitmap
    // context.
    void *data = CGBitmapContextGetData(cgctx);

    CGImageRef ref = CGBitmapContextCreateImage(cgctx);
    updatedImage = [UIImage imageWithCGImage:ref];
    // When finished, release the context
    CGContextRelease(cgctx);
    CGImageRelease(ref);

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

    return updatedImage;    
}

我阅读the comments and answers here关于如何在设备和模拟器之间管理不同的图像,但它没有帮助我弄清楚我的问题。

我的CreateARGBBitmapContext和示例之间的唯一区别是我拨打CGColorSpaceCreateDeviceRGB而不是CGColorSpaceCreateWithName,因为我的目标是iOS。在iOS设备上运行时,图像的编辑完全符合设计。

我目前正在主线程中进行所有图像处理以调试此问题。

规格:Mountain Lion,XCode 4.5.2,iOS 6设备,iOS 6模拟器

1 个答案:

答案 0 :(得分:0)

我能够通过允许Quartz为位图(Apple doc)分配和管理内存来解决这个问题。为此,我更新了CGBitmapContextCreateCreateARGBBitmapContext的调用以传递NULL,并删除了对bitmapData的所有引用。

// 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 (NULL,
                                pixelsWide,
                                pixelsHigh,
                                8,      // bits per component
                                bitmapBytesPerRow,
                                colorSpace,
                                kCGImageAlphaPremultipliedFirst);

然后,在updateImage方法中,我删除了data的释放。现在它似乎在设备和模拟器上都没有任何问题。