12

ご覧いただきありがとうございます。

これが私のコードです

 CIImage *result = _vignette.outputImage;
self.mainImageView.image = nil;
//self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;
self.mainImageView.image = [UIImage imageWithCIImage:result];
self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;

ここで_vignetteは、フィルターが正しく設定されており、画像効果が画像に正しく適用されています。

解像度 500x375 のソース画像を使用しています。私のimageViewはほぼiPhoneの画面の解像度です。ストレッチを避けるために、私は AspectFit を使用しています。

しかし、結果の画像を私のimageViewに戻すときに効果を適用した後、それは伸びます。どちらUIViewContentModeを使っても。うまくいきません。ScaleToFill私が与えたフィルターに関係なく、常に適用されるようです。

なぜこれが起こっているのですか?どんな提案でも大歓迎です。

4

3 に答える 3

24

(1) Aspect Fit画像を引き伸ばします - 収まるようにします。画像をまったく引き伸ばしたくない場合は、Center を使用します (たとえば)。

(2)imageWithCIImage非常に奇妙な獣、CGImageに基づいていないUIImageを提供するため、レイヤー表示の通常のルールの影響を受けません。それは本当にあなたが望むものではないCIImageの薄いラッパーに他なりません。CGImage を介して CIFilter 出力を UIImage に変換 (レンダリング) する必要があります。これにより、実際にいくつかのビット (CGImage、ビットマップ) を持つ UIImage が得られます。ここでの私の議論は、次のことを示すコードを提供します。

http://www.apeth.com/iOSBook/ch15.html#_cifilter_and_ciimage

つまり、ある時点で CIContext を呼び出しcreateCGImage:fromRect:て、CIFilter の出力から CGImageRef を生成し、それを UIImage に渡す必要があります。それを行うまでは、フィルター操作の出力を実際の UIImage として取得することはできません。

imageWithCIImageまたは、画像をグラフィック コンテキストに描画することもできます。たとえば、画像グラフィックス コンテキストに描画して、その画像を使用できます。

できないのは、画像をimageWithCIImage直接表示することです。イメージじゃないから!基になるビットマップ (CGImage) はありません。そこにはありません。画像を取得するための一連の CIFilter 命令だけです。

于 2013-04-08T18:35:38.677 に答える
1

私はこれに一日中費やしました。オリエンテーションの問題に続いて、出力の品質が低下していました。

カメラを使用して画像をスナップした後、これを行います。

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
                UIImage *image = [[UIImage alloc] initWithData:imageData];

これにより回転の問題が発生するため、これを行う必要がありました。

UIImage *scaleAndRotateImage(UIImage *image)
{
    int kMaxResolution = image.size.height; // Or whatever

    CGImageRef imgRef = image.CGImage;

    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGAffineTransform transform = CGAffineTransformIdentity;
    CGRect bounds = CGRectMake(0, 0, width, height);
    if (width > kMaxResolution || height > kMaxResolution) {
        CGFloat ratio = width/height;
        if (ratio > 1) {
            bounds.size.width = kMaxResolution;
            bounds.size.height = bounds.size.width / ratio;
        }
        else {
            bounds.size.height = kMaxResolution;
            bounds.size.width = bounds.size.height * ratio;
        }
    }

    CGFloat scaleRatio = bounds.size.width / width;
    CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
    CGFloat boundHeight;
    UIImageOrientation orient = image.imageOrientation;
    switch(orient) {

        case UIImageOrientationUp: //EXIF = 1
            transform = CGAffineTransformIdentity;
            break;

        case UIImageOrientationUpMirrored: //EXIF = 2
            transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            break;

        case UIImageOrientationDown: //EXIF = 3
            transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;

        case UIImageOrientationDownMirrored: //EXIF = 4
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
            transform = CGAffineTransformScale(transform, 1.0, -1.0);
            break;

        case UIImageOrientationLeftMirrored: //EXIF = 5
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
            transform = CGAffineTransformScale(transform, -1.0, 1.0);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationLeft: //EXIF = 6
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
            transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
            break;

        case UIImageOrientationRightMirrored: //EXIF = 7
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeScale(-1.0, 1.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        case UIImageOrientationRight: //EXIF = 8
            boundHeight = bounds.size.height;
            bounds.size.height = bounds.size.width;
            bounds.size.width = boundHeight;
            transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
            transform = CGAffineTransformRotate(transform, M_PI / 2.0);
            break;

        default:
            [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"];

    }

    UIGraphicsBeginImageContext(bounds.size);

    CGContextRef context = UIGraphicsGetCurrentContext();

    if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) {
        CGContextScaleCTM(context, -scaleRatio, scaleRatio);
        CGContextTranslateCTM(context, -height, 0);
    }
    else {
        CGContextScaleCTM(context, scaleRatio, -scaleRatio);
        CGContextTranslateCTM(context, 0, -height);
    }

    CGContextConcatCTM(context, transform);

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();  

    return imageCopy;  
}

次に、フィルターを適用するときにこれを行います(このスレッドに特に感謝します-特にマットとウェックス)

    -(UIImage*)processImage:(UIImage*)image {

            CIImage *inImage = [CIImage imageWithCGImage:image.CGImage];

            CIFilter *filter = [CIFilter filterWithName:@"CIColorControls" keysAndValues:
                        kCIInputImageKey, inImage,
                        @"inputContrast", [NSNumber numberWithFloat:1.0],
                        nil];

    UIImage *outImage = [filter outputImage];

//Juicy bit
            CGImageRef cgimageref = [[CIContext contextWithOptions:nil] createCGImage:outImage fromRect:[outImage extent]];

            return [UIImage imageWithCGImage:cgimageref];
        }
于 2014-07-24T14:34:42.127 に答える