2011-07-28 8 views
7

OpenGL ES 2.0テクスチャとして使用するテキストからRGBA8イメージを生成しようとしています。Core GraphicsでRGBAイメージをどのように生成しますか?

+(UIImage *)imageFromText:(NSString *)text 
{ 
    UIFont *font = [UIFont systemFontOfSize:20.0]; 
    CGSize size = [text sizeWithFont:font]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef contextRef = CGBitmapContextCreate (NULL, 
                size.width, size.height, 
                8, 4*size.width, 
                colorSpace, 
                kCGImageAlphaLast 
                ); 
    CGColorSpaceRelease(colorSpace); 
    UIGraphicsPushContext(contextRef); 

    [text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsPopContext(); 

    return image; 
} 

は残念ながら、CGColorSpaceCreateDeviceRGBAはありませんし、次のエラーでCGColorSpaceCreateDeviceRGB結果:

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 448 bytes/row. 

私はOpenGLがここに望んで適切RGBA8形式を作成するために何をしないのですか?

更新:私は誤って試みたいくつかのバリエーションの一つである、kCGImageAlphaLastに(私は、コードを貼り付けコピーしたときにそれがあった)kCGImageAlphaNoneからCGBitmapContextCreateの最後のパラメータを変更しました。

アップデート2:コンテキストがUIGraphicsBeginImageContext()で作成されなかった場合UIGraphicsGetImageFromCurrentImageContext()はnilを返すので、異なる画像を抽出する必要がある:[UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)]

答えて

14

作成時に指定した色空間によって、そのようなエラーは発生しません。

あなたがそのエラーを取得している理由は、コンポーネントごとに8ビット、あなたがbytesPerRowのために渡された4*size.width値、まだkCGImageAlphaNonebitmapInfoパラメータでおそらく4色成分を指定したということです。 kCGImageAlphaNoneは、RGBAではなく、RGBを意味します。 RGBAが必要な場合は、おそらくkCGImageAlphaLastkCGImageAlphaPremultipliedLastと指定する必要があります。

[編集]申し訳ありません。私はkCGImageAlphaPremultipliedLastと言うべきで、kCGImageAlphaLastではないはずです。

ので、このような何か:

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 
CGContextRef contextRef = CGBitmapContextCreate(NULL, 
               size.width, 
               size.height, 
               8, 
               4 * size.width, 
               colorSpace, 
               kCGImageAlphaPremultipliedLast); 
+1

この答えは上のスポットです。 :) –

+1

私もそれを試みました。 "CGBitmapContextCreate:サポートされていないパラメータの組み合わせ:8整数ビット/コンポーネント、32ビット/ピクセル、3コンポーネントカラースペース、kCGImageAlphaLast、448バイト/行"という同じエラーが表示されます。 –

+0

私はまだkCGImageAlphaLastでエラーが発生していることを示すために質問を更新しました。 –

1

私はkCGImageAlphaPremultipliedLastを使用していたにもかかわらず、同じunsupported parameter combinationエラーを得ていました。私の場合の問題は、私が得た幅が分数であることが判明しました。それを整数に変換してint(width)をCGBitmapContextCreateに渡して問題を解決しました。小数幅の紙送りにスティーブンの

comment--問題に対応して

--edit第二引数はCGBitmapContextCreateはそのように解釈することはないとして - 述べたように、それは引数の暗黙的にキャストします符号なし整数型。むしろ、int(width * 4)はint(width)* 4と同じではないため、bytes_per_row引数に不一致が生じます。幅が22.5である場合、幅は22に切り捨てられますが、width * 4が90に計算し、ない88

+1

'CGBitmapContextCreate'のwidth引数はすでに(符号なしの)整数です。キャスティングはあなたのために行われます。 –

+0

このノートでは観測が報告されているため、定義されていないため、発生していません。それを言って、私の分析は不完全でした。私は自分の反応を編集し、分数幅を使うことがなぜ問題なのかを明確にしました。 – er0

+1

本当に、私は観測/測定に疑問を抱いていました。明確化のためにありがとう。ちなみに、OPのようなデータ引数にNULLを使用している場合は、システムが正しい(そしておそらくより性能の高い)値を選択できるように、1行あたりのバイト数も0を渡します。 –

0
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); 

    CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little; 

    CGContextRef theContext = CGBitmapContextCreate(NULL, imgSize.width, imgSize.height, 8, 4*imgSize.width, colorSpace, bitmapInfo); 
関連する問題