Question

J'essaie de recadrer une zone à partir d'un uiimage à utiliser avec GlkTextureLoader. Je peux définir la texture directement en utilisant le uiImage avec ce qui suit:

- (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);
    }
}

Cependant, si j'essaie de recadrer l'image de cette façon:

- (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);
    }
}

J'obtiens cette erreur:

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

Comment puis-je prendre une section de l'UIIMage à utiliser comme texture avec glkTextureLoader?

Était-ce utile?

La solution

En fin de compte, je l'ai fait fonctionner avec UIImagePnGrepresentation, j'apprends uniquement OpenGL / GLKIT en ce moment - donc pas un expert, mais je suppose que le CGIMAGE manquait un espace couleurs ou d'autres données requises pour les textures.

- (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);
    }
}

Autres conseils

J'ai le même problème. Il semble que ce bug provienne de ce que je redessine l'image.

Il sortira, si je crée le CGContext comme ceci:

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

Cependant, il chargera la texture avec succès, si je crée le CGContext comme ceci:

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

J'ai eu la même erreur en raison de paramètres alpha incorrects pour un cgimageref. La documentation de GlKTextureLoader répertorie les formats CGIMage pris en charge dans le tableau 1.

Documentation Apple

J'ai changé de code utilisé pour créer un contexte à partir de

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);

Tout va bien pour moi maintenant. Et cela devrait résoudre le problème de Feng Stone. Pour toi je recommanderais de sauter CGImageCreateWithImageInRect fonction et créez un nouveau CGContext avec des paramètres corrects, où vous pouvez dessiner votre image avec CGContextDrawImage

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top