5

UIImage を CIImage から適切に構築するために、さまざまなオプションやトリックを試してきました。しかし、CIImage を作成するたびに、その色が反転しているように見えます。

私が持っている最新のコードは次のとおりです。

NSURL *url = [[NSBundle mainBundle] URLForResource:@"C4Sky" withExtension:@"png"];
CIImage *c = [CIImage imageWithContentsOfURL:url];
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

これにより、次の画像が生成されます。

反転カラー画像。

ただし、次のようなイメージを構築します。

UIImage *i = [UIImage imageNamed:@"C4Sky"];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

... 次の画像を生成します。

ここに画像の説明を入力

CIImage を構築するさまざまな方法を試しました。

これは、iOS の CIImage のピクセル形式が ARGB であるためですか? (現在 iOS6 で可能なフォーマットはこれだけのようです)

もしそうなら、どうすればこのCIImageが正常に見えるようにピクセルフォーマットを交換できますか?



私が試した主要なさまざまな方法をすべて示す git のプロジェクト リポジトリを作成しました (それぞれのバリエーションは含まれません)。6 つの方法があり、最初の 5 つは失敗します。

https://github.com/C4Code/CIImageTest

最後の方法は機能しますが、本当に汚いです:

-(void)test6 {
    UIImage *img = [UIImage imageNamed:@"C4Sky"];

    CGContextRef    bitmapContext = NULL;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;
    CGSize          size = img.size;
    bitmapBytesPerRow   = (size.width * 4);
    bitmapByteCount     = (bitmapBytesPerRow * size.height);
    bitmapData = malloc( bitmapByteCount );
    bitmapContext = CGBitmapContextCreate(bitmapData, size.width, size.height,8,bitmapBytesPerRow,
                                          CGColorSpaceCreateDeviceRGB(),kCGImageAlphaPremultipliedFirst);
    CGContextDrawImage(bitmapContext, (CGRect){CGPointZero,size}, img.CGImage);
    CGImageRef imgRef = CGBitmapContextCreateImage(bitmapContext);

    CIImage *cii = [CIImage imageWithCGImage:imgRef];
    UIImage *finalImage = [UIImage imageWithCIImage:cii];

    UIImageView *uiiv = [[UIImageView alloc] initWithImage:finalImage];
    [self.canvas addSubview:uiiv];
    //works but it's dirrrrrrrty
}

UIImage から自分のグラフィックス コンテキストに描画しています。これが機能するため、CIImage のネイティブ実装にバグがある可能性があると思います。つまり、UIImage から CIImage を作成することはできません... 繰り返しますが、私が考えることができる唯一のことは、CIImage が ARGB 空間にあり、UIImage がそうではないということです...しかし、私は知りませんこれを回避する方法は?

これはバグですか?

4

3 に答える 3

6

試してみるいくつかの追加のバリアント:

//Grab the CIImage directly from the UIImage
UIImage *img = [UIImage imageNamed:@"C4Sky.png"];
CIImage *c = img.CIImage;
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

または

//Maybe you need to set your own color space?
UIImage *img = [UIImage imageNamed:@"C4Sky.png"];
CIImage *c = [CIImage imageWithCGImage:img.CGImage options:@{kCIImageColorSpace: kCGColorSpaceModelRGB}];
UIImage *i = [UIImage imageWithCIImage:c];
UIImageView *uiiv = [[UIImageView alloc] initWithImage:i];
[self.canvas addSubview:uiiv];

-jt

于 2013-01-31T09:35:31.970 に答える
2

これも前に私を噛みました。UIImage私は次のようなものでs からsを変換CIImageします:

- (UIImage *)newUIImageFromCIImage:(CIImage *)image
{
    CGImageRef newImageRef = [[CIContext contextWithOptions:nil] createCGImage:image fromRect:[image extent]]; // you can cache CIContext as it's a little slow to create
    UIImage *newImage = [[UIImage alloc] initWithCGImage:newImageRef];
    CGImageRelease(newImageRef);

    return newImage;
}

ここでいくつかの議論。

于 2013-02-07T06:01:12.157 に答える
1

このチュートリアルを見てください。見た目が良くなる前にフィルターを適用する必要があります。お役に立てれば!

レイチェル :)

例(リンクが壊れた場合に備えて)

CIImage *beginImage = [CIImage imageWithContentsOfURL:fileNameAndPath];

CIContext *context = [CIContext contextWithOptions:nil];

CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"
                          keysAndValues: kCIInputImageKey, beginImage,
                @"inputIntensity", @0.8, nil];
CIImage *outputImage = [filter outputImage];


CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];


UIImage *newImage = [UIImage imageWithCGImage:cgimg]; 
self.imageView.image = newImage;


CGImageRelease(cgimg);
于 2013-01-31T05:36:03.973 に答える