在UIImage(PNG)和RGB8之间转换

时间:2011-08-24 15:00:52

标签: ios objective-c uiimage pixel cgimage

我正在使用https://github.com/PaulSolt/UIImage-Conversion

然而,它似乎在alpha通道上有问题。 Problem reconstituting UIImage from RGBA pixel byte data

我已经简化了问题所以我把它作为一个更整洁的问题。

我下载了Paul的项目,运行它。它在屏幕中央显示一个图像 - 到目前为止所有内容都是正确的。

但是他的演示没有测试Alpha。

所以我尝试合成我的按钮图像......

enter image description here

......在上面。

结果是:

enter image description here

这是代码 - 我刚刚修改了AppDelegate_iPad.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.
    {
        UIImage *image = [UIImage imageNamed:@"Icon4.png"];
        int width = image.size.width;
        int height = image.size.height;

        // Create a bitmap
        unsigned char *bitmap = [ImageHelper convertUIImageToBitmapRGBA8:image];

        // Create a UIImage using the bitmap
        UIImage *imageCopy = [ImageHelper convertBitmapRGBA8ToUIImage:bitmap withWidth:width withHeight:height];

        // Cleanup
        if(bitmap) {
            free(bitmap);   
            bitmap = NULL;
        }

        // Display the image copy on the GUI
        UIImageView *imageView = [[UIImageView alloc] initWithImage:imageCopy];
        CGPoint center = CGPointMake([UIScreen mainScreen].bounds.size.width / 2.0, 
                                     [UIScreen mainScreen].bounds.size.height / 2.0);
        [imageView setCenter:center];
        [window addSubview:imageView];
        [imageView release];
    }


    if( 1 )
    {
        UIImage *image = [UIImage imageNamed:@"OuterButton_Dull.png"];
        int width = image.size.width;
        int height = image.size.height;

        // Create a bitmap
        unsigned char *bitmap = [ImageHelper convertUIImageToBitmapRGBA8:image];

        // Create a UIImage using the bitmap
        UIImage *imageCopy = [ImageHelper convertBitmapRGBA8ToUIImage:bitmap withWidth:width withHeight:height];

        // Cleanup
        if(bitmap) {
            free(bitmap);   
            bitmap = NULL;
        }

        // Display the image copy on the GUI
        UIImageView *imageView = [[UIImageView alloc] initWithImage:imageCopy]; // <-- X
        imageView.backgroundColor = [UIColor clearColor];
        CGPoint center = CGPointMake([UIScreen mainScreen].bounds.size.width / 2.0, 
                                     [UIScreen mainScreen].bounds.size.height / 2.0);
        [imageView setCenter:center];
        [window addSubview:imageView];
        [imageView release];

    }


    [window makeKeyAndVisible];

    return YES;
}

如果我切换标记的行......

// <-- X 

说...

... initWithImage:image]; // instead of imageCopy

...显示应该:

enter image description here

有人对此有所了解吗?它看起来非常好用,但我无法弄清楚问题出在哪里。

1 个答案:

答案 0 :(得分:1)

我刚收到作者的回复:

在他的博客文章的底部,http://paulsolt.com/2010/09/ios-converting-uiimage-to-rgba8-bitmaps-and-back/ Scott Davies提出了一个解决方案:

  

您的代码有一个简单的单行修复,以便alpha通道   从字节缓冲区到UIImage时保留。在   convertBitmapRGBA8ToUIImage,改变这个:

     

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;

     

到此:

     

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault |   kCGImageAlphaPremultipliedLast;