35

私は、人々が白い背景に対して自分の画像をアップロードできるようにするアプリを構築しています。アプリは人のシルエットを作成します。

背景を切り出すのに苦労しています。私はGPUImageフレームワークを使用しており、GPUImageChromaKeyBlendFilter色には最適ですが、白/黒になると、それらの色の 1 つをキーアウトするのは非常に困難です。キーを白または黒に設定すると、両方とも同じキーになります。

何かアドバイス?

4

4 に答える 4

0

したがって、白を透明に変更するには、次の方法を使用できます。

-(UIImage *)changeWhiteColorTransparent: (UIImage *)image {
    CGImageRef rawImageRef=image.CGImage;

    const float colorMasking[6] = {222, 255, 222, 255, 222, 255};

    UIGraphicsBeginImageContext(image.size);
    CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking);
    {
        //if in iphone
        CGContextTranslateCTM(UIGraphicsGetCurrentContext(), 0.0, image.size.height);
        CGContextScaleCTM(UIGraphicsGetCurrentContext(), 1.0, -1.0); 
    }

    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, image.size.width, image.size.height), maskedImageRef);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    CGImageRelease(maskedImageRef);
    UIGraphicsEndImageContext();    
    return result;
}

不透明なピクセルを黒に置き換えるには、次を使用できます。

- (UIImage *) changeColor: (UIImage *)image {
    UIGraphicsBeginImageContext(image.size);

    CGRect contextRect;
    contextRect.origin.x = 0.0f;
    contextRect.origin.y = 0.0f;
    contextRect.size = [image size];
    // Retrieve source image and begin image context
    CGSize itemImageSize = [image size];
    CGPoint itemImagePosition;
    itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width) / 2);
    itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height) );

    UIGraphicsBeginImageContext(contextRect.size);

    CGContextRef c = UIGraphicsGetCurrentContext();
    // Setup shadow
    // Setup transparency layer and clip to mask
    CGContextBeginTransparencyLayer(c, NULL);
    CGContextScaleCTM(c, 1.0, -1.0);
    CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [image CGImage]);

    CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);


    contextRect.size.height = -contextRect.size.height;
    contextRect.size.height -= 15;
    // Fill and end the transparency layer
    CGContextFillRect(c, contextRect);
    CGContextEndTransparencyLayer(c);

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

したがって、実際にはこれは次のようになります。

-(UIImage *)silhouetteForImage:(UIImage *)img {
    return [self changeColour:[self changeWhiteColorTransparent:img]];
}

明らかに、すべてをスムーズに実行し続けるために、これをバックグラウンドスレッドで呼び出します。

于 2013-01-27T22:56:15.793 に答える
0

達成しようとしていることを明確にし、違いを理解することが役立つ場合があります。あなたは、私が収集した半透明性と透明性から話している.

透過性はアルファを考慮に入れ、画像ピクセルのアルファ値と背景バッファで実行される評価の種類に基づいて、背景を前景とブレンドできるようにします。

透明度を使用すると、ハード アルファとしきい値を使用して画像の部分を「マスク」し、ブレンドせずに背景をマスクを通して見ることができます。しきい値は、しきい値までのアルファ値に基づいて制限されたブレンドを許可します。

クロモキーイングは、ハード コードされた色をマスク カラー (またはブレンド キーイングのアルファしきい値) として設定できるため、透明度に似ています。これにより、その色を持つ前景の部分を通して背景が見えるようになります。

画像形式がアルファ値のデータ型またはピクセル形式をサポートしている場合、次の計算は非常に簡単です。

明度に基づくアルファ = (R + G + B) / 3;

チャネル プレゼンスに基づくアルファ = Max(R,G,B);

アルファしきい値が 127 のブレンドされた透明度は、127 以下の値でアルファ テストに合格したすべてのピクセルがブレンドされ、127 を超えるピクセルがハード マスクされることを意味します。

明確でない場合に備えて、少し明確にするのに役立つことを願っています。素晴らしいコードたち。

于 2013-07-23T15:08:39.403 に答える