Découper un UIImage sur iPhone
Objectif: prendre une UIImage, découper un carré dans le milieu, changer la taille de la place de 320x320 pixels, découper l'image en 16 80x80 images, enregistrez le 16 images dans un tableau.
Voici mon code:
CGImageRef originalImage, resizedImage, finalImage, tmp;
float imgWidth, imgHeight, diff;
UIImage *squareImage, *playImage;
NSMutableArray *tileImgArray;
int r, c;
originalImage = [image CGImage];
imgWidth = image.size.width;
imgHeight = image.size.height;
diff = fabs(imgWidth - imgHeight);
if(imgWidth > imgHeight){
resizedImage = CGImageCreateWithImageInRect(originalImage, CGRectMake(floor(diff/2), 0, imgHeight, imgHeight));
}else{
resizedImage = CGImageCreateWithImageInRect(originalImage, CGRectMake(0, floor(diff/2), imgWidth, imgWidth));
}
CGImageRelease(originalImage);
squareImage = [UIImage imageWithCGImage:resizedImage];
if(squareImage.size.width != squareImage.size.height){
NSLog(@"image cutout error!");
//*code to return to main menu of app, irrelevant here
}else{
float newDim = squareImage.size.width;
if(newDim != 320.0){
CGSize finalSize = CGSizeMake(320.0, 320.0);
UIGraphicsBeginImageContext(finalSize);
[squareImage drawInRect:CGRectMake(0, 0, finalSize.width, finalSize.height)];
playImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}else{
playImage = squareImage;
}
}
finalImage = [playImage CGImage];
tileImgArray = [NSMutableArray arrayWithCapacity:0];
for(int i = 0; i < 16; i++){
r = i/4;
c = i%4;
//*
tmp = CGImageCreateWithImageInRect(finalImage, CGRectMake(c*tileSize, r*tileSize, tileSize, tileSize));
[tileImgArray addObject:[UIImage imageWithCGImage:tmp]];
}
Le code fonctionne correctement lorsque l'original (la variable image) a sa plus petite dimension, soit plus grand ou plus petit que 320 pixels. Quand il est exactement 320, la 80x80 les images sont presque entièrement noir, certains avec quelques pixels sur les bords, qui peut être (je ne peux pas vraiment dire) soit à partir de l'image d'origine.
J'ai testé par l'affichage de la totalité de l'image, à la fois directement:
[UIImage imageWithCGImage:finalImage];
Et indirectement:
[UIImage imageWithCGImage:CGImageCreateWithImageInRect(finalImage, CGRectMake(0, 0, 320, 320))];
Dans les deux cas, l'affichage travaillé. Les problèmes ne se posent que lorsque je tente de couper une partie de l'image.
source d'informationauteur executor21
Vous devez vous connecter pour publier un commentaire.
Après quelques expérimentations, j'ai trouvé la solution suivante (je ne sais toujours pas pourquoi il ne fonctionne pas comme écrit à l'origine, cependant). Mais de toute façon, le découpage des travaux après la redimensionner code est mis en place même quand la taille est inutile:
Quelqu'un a la moindre idée POURQUOI ce qui se passe?
P. S. Oui, si/d'autre n'est plus nécessaire ici. Retrait de avant je savais que j'allais au travail serait stupide, si.
Juste par curiosité, pourquoi avez-vous fait votre mutable tableau avec limite 0 quand vous savez que vous allez mettre 16 choses?
Bien, à part cela, j'ai essayé les techniques de base que vous avez utilisé pour le redimensionnement et le découpage (je n'ai pas besoin de recadrer, parce que je travaille avec des images qui sont déjà en place) et je n'arrive pas à reproduire votre problème dans le simulateur. Vous voudrez peut-être essayer de casser votre code en trois fonctions distinctes (la culture à carré, redimensionner, et les couper en morceaux), puis de tester les trois séparément de sorte que vous pouvez déterminer lequel des trois étapes est à l'origine des problèmes (c'est à dire. les images de l'entrée que vous avez manipulé dans un programme graphique normal au lieu d'utiliser objective-c, puis inspectez ce que vous obtenez de retour!).
Je vais l'attacher mes versions de les redimensionner les et tranchez-les fonctions ci-dessous, qui nous l'espérons être utile. C'était agréable d'avoir de vos versions de regarder, car je n'avais pas à trouver toutes les méthodes par moi-même pour une fois. 🙂
Juste une remarque, le tableau à deux dimensions mentionné, c'est ma propre classe construites à partir de NSMutableArrays, mais vous pouvez facilement mettre en place votre propre version ou l'utilisation d'une télévision NSMutableArray à la place. 😉
Eva Schiffer