2012-10-04 3 views
0

J'ai réussi à utiliser le GPUImage dans mon application maintenant et j'ai essayé de mettre des filtres dans mes photos en cliquant sur le bouton, mais il y a un autre problème.GPUImage: GPUImageToneCurveFilter ne fonctionne pas

GPUImageFilter *selectedFilter; 
    if (sender.tag == 1) { 
     selectedFilter = [[GPUImageFilter alloc] init]; 
    } else if (sender.tag == 2) { 
     selectedFilter = [[GPUImageThresholdEdgeDetection alloc] init]; 
    } else if (sender.tag == 3) { 
     selectedFilter = [[GPUImageSketchFilter alloc] init]; 
    } else if (sender.tag == 4) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"crossprocess.acv"]; 
    } else if (sender.tag == 5) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"Summer.acv"]; 
    } else if (sender.tag == 6) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"NightCat.acv"]; 
    } else if (sender.tag == 7) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"Breeze.acv"]; 
    } else if (sender.tag == 8) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"OldTone.acv"]; 
    } else if (sender.tag == 9) { 
     selectedFilter = [[GPUImageToneCurveFilter alloc] initWithACV:@"Sky.acv"];   
    } 
    filteredImg = [selectedFilter imageByFilteringImage:image]; 
    [insertPhoto1 setImage:filteredImg]; 

GPUImageToneCurveFilter ne fonctionne pas, chaque fois que je clique sur un bouton avec .acv filtre, il bloque l'application et jette cette erreur.

Thread 1: Program received signal: "EXC_BAD_ACCESS". 

avec le point culminant de cette partie

version = CFSwapInt16BigToHost(*(int*)([databuffer bytes])); 

Que dois-je faire? Que signifie l'erreur?

Répondre

0

semble que vous avez un problème de gestion de la mémoire ici avec la diffusion de vos variables. Vous utilisez deux signes de pointeur. Cela me semble faux.

version = CFSwapInt16BigToHost((int*)([databuffer bytes])); 

ou mieux

version = CFSwapInt16BigToHost([databuffer bytes]); 

Assurez-vous que la arg et les valeurs de retour correspond à la fonction selon le manuel!

dans le manuel de pomme cela est indiqué sur cette fonction:

CFSwapInt16HostToBig 

Transforme un de l'ordre natif des octets de l'hôte entier de 16 bits au format grand-boutiste.

uint16_t CFSwapInt16HostToBig (
    uint16_t arg 
); 

Paramètres * arg * L'entier dont les octets doivent être permutés. Valeur de retour L'entier avec ses octets a été échangé. Si l'hôte est big-endian, cette fonction retourne l'argument inchangé.