3

私たちがやろうとしていることの基本的な考え方は、大きな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();
}

どんなアドバイスも大歓迎です!!

4

1 に答える 1

0

originalImageView は IBOutlet の ImageView です。この画像はトリミングされます。

#import <QuartzCore/QuartzCore.h>

理解を深めるために、各スライスの周りの白い境界線には QuartzCore が必要です。

-(UIImage*)getCropImage:(CGRect)cropRect
{
CGImageRef image = CGImageCreateWithImageInRect([originalImageView.image CGImage],cropRect);
UIImage *cropedImage = [UIImage imageWithCGImage:image];
CGImageRelease(image);
return cropedImage;
}

-(void)prepareSlices:(uint)row:(uint)col
{
float flagX = originalImageView.image.size.width / originalImageView.frame.size.width;
float flagY = originalImageView.image.size.height / originalImageView.frame.size.height;

float _width    = originalImageView.frame.size.width / col;
float _height   = originalImageView.frame.size.height / row;

float _posX = 0.0;
float _posY = 0.0;

for (int i = 1; i <= row * col; i++) {

    UIImageView *croppedImageVeiw = [[UIImageView alloc] initWithFrame:CGRectMake(_posX, _posY, _width, _height)];
    UIImage *img = [self getCropImage:CGRectMake(_posX * flagX,_posY * flagY, _width * flagX, _height * flagY)];
    croppedImageVeiw.image = img;

    croppedImageVeiw.layer.borderColor = [[UIColor whiteColor] CGColor];
    croppedImageVeiw.layer.borderWidth = 1.0f;

    [self.view addSubview:croppedImageVeiw];
    [croppedImageVeiw release];

    _posX += _width;

    if (i % col == 0) {
        _posX = 0;
        _posY += _height;
    }

}

originalImageView.alpha = 0.0;

}

originalImageView.alpha = 0.0; originalImageView は表示されなくなります。

次のように呼び出します。

[self prepareSlices:4 :4];

self.view に 16 個のスライス addSubView を作成する必要があります。パズルアプリがあります。これはそこからの作業コードです。

于 2012-06-03T08:21:37.860 に答える