2012-01-23 6 views
1

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

- (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?

ответ

6

В конце концов, я получил его для работы с UIImagePNGRпредставлением, я изучаю 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); 
    } 
} 
+5

Если бы у вас было еще лучшее решение? –

0

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

Он выйдет, если я создаю CGContext так:

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

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

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

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

Apple Documentation

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

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