Преобразование между UIImage (PNG) и RGB8 - PullRequest
0 голосов
/ 24 августа 2011

Я использую https://github.com/PaulSolt/UIImage-Conversion

Однако, похоже, проблема с альфа-каналом. Проблема восстановления UIImage из данных байтов пикселей RGBA

Я упростил задачу, поэтому я представляю ее как вопрос более аккуратного типа.

Я загружаю проект Пола, запускаю его.Он отображает изображение в центре экрана - пока что все правильно.

Но его демонстрация не проверяет альфу.

Поэтому я пытаюсь скомбинировать изображение моей кнопки ...

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 Ответ

1 голос
/ 24 августа 2011

Я только что получил ответ от автора:

В нижней части своего поста в блоге http://paulsolt.com/2010/09/ios-converting-uiimage-to-rgba8-bitmaps-and-back/ Скотт Дэвис представляет исправление:

Существует простое однострочное исправление для вашего кода, так что альфа-каналы сохраняется при переходе от байтового буфера к UIImage. В convertBitmapRGBA8ToUIImage, измените это:

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;

к этому:

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

...