Objetivo: tomar un UIImage, recortar un cuadrado en el medio, cambiar el tamaño del cuadrado a 320x320 píxeles, cortar la imagen en 16 imágenes de 80x80, guardar las 16 imágenes en una matriz.Recortar un UIImage en iPhone
Aquí está mi código:
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]];
}
el código funciona correctamente cuando el original (la variable imagen) tiene su dimensión más pequeña, ya sea mayor o menor que 320 píxeles. Cuando es exactamente 320, las imágenes resultantes de 80x80 son casi totalmente negras, algunas con algunos píxeles en los bordes que pueden (realmente no puedo decir) ser de la imagen original.
He probado mediante la visualización de la imagen completa tanto de forma directa:
[UIImage imageWithCGImage:finalImage];
e indirectamente:
[UIImage imageWithCGImage:CGImageCreateWithImageInRect(finalImage, CGRectMake(0, 0, 320, 320))];
En ambos casos, la pantalla trabajó. Los problemas solo surgen cuando intento cortar una parte de la imagen.