2

ここにデモアプリがあります https://github.com/rdeert/image-transform-test

画像をインポートした後、画像をピンチ、ズーム、回転できます。私がやりたいことは640x480、ライブ プレビューと同じように見える画像 (横向きモード) を保存することです。したがって、両側に 100 ピクセルの空のバーがある場合、最終出力にも同じ空のバーが必要です (適切にスケーリングされます)。

これは、私が思っていたよりも難しいことが証明されています。何日も取り組んだ後、すぐにそれを出すことはできません。

最終的な画像を生成する魔法のメソッドが呼び出されます-(void)generateFinalImage

幸運を!;)

編集

デモアプリのスクリーンショット

緑色の四角形は、インポートされた画像をピンチ、ズーム、回転できる実際の領域を表します。たとえば、iPhone 4S の解像度は 852x640 です。

青い四角形はデバッグ用のライブ プレビューにすぎず、縦横比は 640x480 と同じです。Core Image が非常に遅いため、ライブ プレビューが非常に遅くなる可能性があります。

私がやりたいことは、緑色の四角形にあるものをすべて640x480画像に変換することです。852x640とは縦横比が若干異なることに注意してください640x480。しかし、それは大きな問題ではありません。

4

1 に答える 1

2

あなたの目標は、編集しているものの正確なコピーを取得することですが、元の画像のサイズはありますか? 次のような方法で取得できると思います。

- (UIImage *)padImage:(UIImage *)img to:(CGSize)size
{
    if (size.width < img.size.width && size.height < img.size.height) return img;

    size.width = MAX(size.width, img.size.width);
    size.height = MAX(size.height, img.size.height);

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);

    CGRect centeredRect = CGRectMake((size.width - img.size.width)/2.0, (size.height - img.size.height)/2.0, img.size.width, img.size.height);
    CGContextDrawImage(context, centeredRect, [img CGImage]);

    CGImageRef imageRef = CGBitmapContextCreateImage(context);

    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);

    UIImage *paddedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return paddedImage;
}

// final image size must be 640x480
- (void)generateFinalImage
{
    float rotatableCanvasWidth = 495.0;
    float rotatableCanvasHeight = 320.0;
    UIImage *tmp = self.importedRawImage;

    CGSize size = self.importedRawImage.size;
    NSLog(NSStringFromCGSize(size));

    tmp = [self padImage:tmp to:CGSizeMake(rotatableCanvasWidth, rotatableCanvasHeight)];
    CIImage *ciImage = [[CIImage alloc] initWithImage:[tmp imageWithTransform:self.importedImageView.transform]];

    CGPoint center = CGPointMake(size.width / 2.0, size.height / 2.0);

    CIContext *context = [CIContext contextWithOptions:nil];
    CGRect r = ciImage.extent;
    r.origin.x = (r.size.width - rotatableCanvasHeight) / 2.0;
    r.origin.y = (r.size.height - rotatableCanvasWidth) / 2.0;
    r.size.width = rotatableCanvasHeight;
    r.size.height = rotatableCanvasWidth;
    self.finalImage = [UIImage imageWithCGImage:[context createCGImage:ciImage fromRect:r] scale:1.0 orientation:UIImageOrientationUp];

    self.finalImage = [self.finalImage resizedImage:CGSizeMake(100.0f, 134.0f) interpolationQuality:kCGInterpolationHigh];

    self.previewImageView.image = self.finalImage;
}
于 2012-10-27T00:22:50.187 に答える