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