Обрезать UIImage для использования с GLKTextureLoader - PullRequest
1 голос
/ 23 января 2012

Я пытаюсь обрезать область вне UIImage для использования с GLKTextureLoader.Я могу установить текстуру напрямую, используя UIImage, со следующим:

- (void)setTextureImage:(UIImage *)image
{
    NSError *error;

    texture = [GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&error];

    if(error)
    {
        NSLog(@"Texture Error:%@", error);
    } else {
        self.textureCoordinates[0] = GLKVector2Make(1.0f, 1.0f);
        self.textureCoordinates[1] = GLKVector2Make(1.0f, 0);
        self.textureCoordinates[2] = GLKVector2Make(0, 0);
        self.textureCoordinates[3] = GLKVector2Make(0, 1.0f);
    }
}

Однако, если я попытаюсь обрезать изображение таким образом:

- (void)setTextureImage:(UIImage *)image
{
    NSError *error;

    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0.0, 64.0f, 64.0f, 64.0f));
    texture = [GLKTextureLoader textureWithCGImage:imageRef options:nil error:&error];

    if(error)
    {
        NSLog(@"[SF] Texture Error:%@", error);
    } else {
        self.textureCoordinates[0] = GLKVector2Make(1.0f, 1.0f);
        self.textureCoordinates[1] = GLKVector2Make(1.0f, 0);
        self.textureCoordinates[2] = GLKVector2Make(0, 0);
        self.textureCoordinates[3] = GLKVector2Make(0, 1.0f);
    }
}

Я получаю эту ошибку:

Texture Error:Error Domain=GLKTextureLoaderErrorDomain Code=12 "The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 12.)" UserInfo=0x6a6b550 {GLKTextureLoaderErrorKey=Image decoding failed}

Как взять часть UIImage для использования в качестве текстуры с GLKTextureLoader?

Ответы [ 3 ]

6 голосов
/ 25 января 2012

В итоге я получил его для работы с UIImagePNGRepresentation, сейчас я только изучаю OpenGL / GLKit - так что не эксперт, но я предполагаю, что в CGImage отсутствует некоторое цветовое пространство или некоторые другие данные, которые требуются для текстур .

- (void)setTextureImage:(UIImage *)image withFrame:(CGRect)rect
{
    NSError *error;

    CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, rect);
    image = [UIImage imageWithData:UIImagePNGRepresentation([UIImage imageWithCGImage:imageRef])];

    texture = [GLKTextureLoader textureWithCGImage:image.CGImage options:nil error:&error];

    if(error)
    {
        NSLog(@"[SF] Texture Error:%@", error);
    } else {
        self.textureCoordinates[0] = GLKVector2Make(1.0f, 1.0f);
        self.textureCoordinates[1] = GLKVector2Make(1.0f, 0);
        self.textureCoordinates[2] = GLKVector2Make(0, 0);
        self.textureCoordinates[3] = GLKVector2Make(0, 1.0f);
    }
}
0 голосов
/ 15 октября 2013

У меня была такая же ошибка из-за неправильных настроек альфа-канала для CGImageRef. В документации для GLKTextureLoader перечислены поддерживаемые форматы CGImage в таблице 1.

Документация Apple

Я изменил код, используемый для создания контекста из

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);

до

CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, width * (CGColorSpaceGetNumberOfComponents(space) + 1), space, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedFirst);

Теперь у меня все хорошо. И это должно исправить проблему Фенга Стоуна. Для вас я бы порекомендовал пропустить функцию CGImageCreateWithImageInRect и создать новый CGContext с правильными параметрами, где вы можете нарисовать свое изображение с помощью CGContextDrawImage

0 голосов
/ 14 октября 2013

У меня та же проблема. Похоже, эта ошибка возникает из-за того, что я перерисовываю изображение.

Оно появится, если я создам CGContext следующим образом:

CGBitmapContextCreate(NULL, width, height, 8, 4 * width, colorSpace, kCGBitmapByteOrderDefault|kCGImageAlphaPremultipliedLast);

Тем не менее, он успешно загрузит текстуру, если я создам CGContext следующим образом:

UIGraphicsBeginImageContextWithOptions(aImage.size, NO, aImage.scale);
...