Ziel: nehmen Sie ein UIImage, ein Quadrat in der Mitte ausschneiden, Größe des Quadrats zu 320x320 Pixel ändern, das Bild in 16 80x80 Bilder schneiden, speichern Sie die 16 Bilder in einem Array.Schneiden eines UIImage auf dem iPhone
Hier ist mein 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]];
}
Der Code funktioniert einwandfrei, wenn das Original (die Variable Bild) hat seine kleineren Dimension entweder größer oder kleiner als 320 Pixel. Wenn es genau 320 ist, sind die resultierenden 80x80-Bilder fast vollständig schwarz, einige mit ein paar Pixeln an den Rändern, die (ich kann es nicht wirklich sagen) vom Originalbild stammen.
I durch Anzeige der Vollbild sowohl direkt getestet:
[UIImage imageWithCGImage:finalImage];
Und indirekt:
[UIImage imageWithCGImage:CGImageCreateWithImageInRect(finalImage, CGRectMake(0, 0, 320, 320))];
In beiden Fällen war die Anzeige. Die Probleme treten nur auf, wenn ich versuche, einen Teil des Bildes auszuschneiden.