2

たとえば、UIImage (必要に応じて CGImage、CGLayer などを取得できます) があり、赤のピクセル (1, 0, 0) をすべて青 (0, 0, 1) に置き換えたいとします。 )。

どのピクセルがターゲットの色であるかを判断するコードがあり (この SO の質問と回答を参照)、rawData で適切な値を置き換えることができますが、(a) rawData バッファーから UIImage を取得する方法がわかりません。 (b) このすべてを自動的に実行してくれるビルトインが欠けているように思えます。

ありがとう!

4

1 に答える 1

9

わかりましたので、UIImage を rawBits バッファに取得し (元の質問のリンクを参照)、バッファ内のデータを好みに合わせて調整しました (つまり、テストとして、すべての赤コンポーネント (4 番目のバイトごと) を 0 に設定します)。 )、そして、いじられたデータを表す新しい UIImage を取得する必要があります。

Erica Sudan の iPhone Cookbookの第 7 章 (画像)、例 12 (ビットマップ) で答えを見つけました。関連する呼び出しは CGBitmapContextCreate() で、関連するコードは次のとおりです。

+ (UIImage *) imageWithBits: (unsigned char *) bits withSize: (CGSize)  
size
{
    // Create a color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        free(bits);
        return nil;
    }

    CGContextRef context = CGBitmapContextCreate (bits, size.width,  
size.height, 8, size.width * 4, colorSpace,  
kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        fprintf (stderr, "Error: Context not created!");
        free (bits);
        CGColorSpaceRelease(colorSpace );
        return nil;
    }

    CGColorSpaceRelease(colorSpace );
    CGImageRef ref = CGBitmapContextCreateImage(context);
    free(CGBitmapContextGetData(context));
    CGContextRelease(context);

    UIImage *img = [UIImage imageWithCGImage:ref];
    CFRelease(ref);
    return img;
}

将来のサイトスペランカーに役立つことを願っています!

于 2009-08-11T23:38:29.367 に答える