私たちがやろうとしていることの基本的な考え方は、大きなUIImageがあり、それをいくつかの部分にスライスしたいということです。関数のユーザーは、行数と列数を渡すことができ、それに応じて画像がトリミングされます(つまり、3行3列で画像が9つにスライスされます)。問題は、CoreGraphicsでこれを達成しようとすると、パフォーマンスの問題が発生することです。必要な最大のグリッドは5x5であり、操作が完了するまでに数秒かかります(これはユーザーにラグタイムとして登録されます)。これはもちろん最適とはほど遠いものです。
同僚と私はこれにかなりの時間を費やし、Webで回答を検索できませんでした。私たちのどちらもコアグラフィックスの経験があまりないので、問題を解決するコードにいくつかのばかげた間違いがあることを願っています。SOユーザーの皆さん、私たちがそれを理解するのを手伝ってください!
http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/のチュートリアルを使用して、コードのリビジョンをベースにしました。
以下の関数:
-(void) getImagesFromImage:(UIImage*)image withRow:(NSInteger)rows withColumn:(NSInteger)columns
{
CGSize imageSize = image.size;
CGFloat xPos = 0.0;
CGFloat yPos = 0.0;
CGFloat width = imageSize.width / columns;
CGFloat height = imageSize.height / rows;
int imageCounter = 0;
//create a context to do our clipping in
UIGraphicsBeginImageContext(CGSizeMake(width, height));
CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGRect clippedRect = CGRectMake(0, 0, width, height);
CGContextClipToRect(currentContext, clippedRect);
for(int i = 0; i < rows; i++)
{
xPos = 0.0;
for(int j = 0; j < columns; j++)
{
//create a rect with the size we want to crop the image to
//the X and Y here are zero so we start at the beginning of our
//newly created context
CGRect rect = CGRectMake(xPos, yPos, width, height);
//create a rect equivalent to the full size of the image
//offset the rect by the X and Y we want to start the crop
//from in order to cut off anything before them
CGRect drawRect = CGRectMake(rect.origin.x * -1,
rect.origin.y * -1,
image.size.width,
image.size.height);
//draw the image to our clipped context using our offset rect
CGContextDrawImage(currentContext, drawRect, image.CGImage);
//pull the image from our cropped context
UIImage* croppedImg = UIGraphicsGetImageFromCurrentImageContext();
//PuzzlePiece is a UIView subclass
PuzzlePiece* newPP = [[PuzzlePiece alloc] initWithImageAndFrameAndID:croppedImg :rect :imageCounter];
[slicedImages addObject:newPP];
imageCounter++;
xPos += (width);
}
yPos += (height);
}
//pop the context to get back to the default
UIGraphicsEndImageContext();
}
どんなアドバイスも大歓迎です!!