Aufteilen eines UIImage auf dem iPhone

Ziel: Nimm ein UIImage, schneide ein Quadrat in der Mitte aus, ändere die Größe des Quadrats auf 320x320 Pixel, schneide das Bild in 16 80x80 Bilder auf und speichere die 16 Bilder in einem Array.

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 ordnungsgemäß, wenn das Original (das variable Bild) eine kleinere Dimension aufweist, die größer oder kleiner als 320 Pixel ist. Wenn es genau 320 ist, sind die resultierenden 80x80-Bilder fast vollständig schwarz, einige mit ein paar Pixeln an den Rändern, die vom Originalbild abweichen können (ich kann es nicht wirklich sagen).

Ich habe getestet, indem ich beide direkt im Vollbild angezeigt habe:

[UIImage imageWithCGImage:finalImage];

Und indirekt:

[UIImage imageWithCGImage:CGImageCreateWithImageInRect(finalImage, CGRectMake(0, 0, 320, 320))];

In beiden Fällen funktionierte die Anzeige. Die Probleme treten nur auf, wenn ich versuche, einen Teil des Bildes herauszuschneiden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage