2012-01-09 16 views
2

私のアプリでUIImageのピクセルのアルファ値を変更する方法を見つけることができましたが、2つのエラーが発生しています最初に引き起こされる)。しかし、私は何が起こっているのか把握することはできません。iPhone SDK - <Error>:CGBitmapContextCreate:サポートされていないカラースペース

私の方法:

- (void)modifyAlpha:(int)x and:(int)y { 

    CGContextRef ctx; 
    CGImageRef imageRef = [scratchOffImage CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 
    CGContextRelease(context); 

    // Now your rawData contains the image data in the RGBA8888 pixel format. 
    int byteIndex = (bytesPerRow * y) + x * bytesPerPixel; 

    rawData[byteIndex+3] = (char) (255); //Change the pixel value 
    ctx = CGBitmapContextCreate(rawData, 
           CGImageGetWidth(imageRef), 
           CGImageGetHeight(imageRef), 
           8, 
           CGImageGetBytesPerRow(imageRef), 
           CGImageGetColorSpace(imageRef), 
           kCGImageAlphaPremultipliedFirst); //This line causes an error: incorrect colorspace 

    imageRef = CGBitmapContextCreateImage (ctx); 
    UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

    CGContextRelease(ctx); 

    scratchOffImage = rawImage; 
    [scratchOffImageView setImage:scratchOffImage]; 

    free(rawData); 

} 

エラー:

<Error>: CGBitmapContextCreate: unsupported color space. 

がライン上でスローされます。

ctx = CGBitmapContextCreate(rawData, ... 

した後、第2のエラー:

<Error>: CGBitmapContextCreateImage: invalid context 0x0 

はライン上でスローされます。

imageRef = CGBitmapContextCreateImage (ctx); 

私のイメージは、私が最初にフォーマットとしてtransparancyとPNG-8を使用して、Web機能のためにそれをPhotoshopの保存を出力することによってそれを作ったバンドルに含まれています。

この関数が最初に使用されたサンプルコードを実行すると、サンプルイメージが正常に機能しました。しかし、私のイメージはありません。これをどのようにデバッグできますか?

これをどのようにデバッグすることができますか?私の入力PNGが正しくフォーマットされていない可能性がありますか?これをどうすれば確認できますか?

乾杯、 ブレット

EDIT 1:元のソースコードはhereを発見した例から来ました。サンプルではグレースケールに変換されていますが、アルファ値を変更するだけです。

EDIT 2:画像をPNG-8とPNG-24として保存しようとしましたが、両方とも運がありません。

+0

CGImageGetWidth(imageRef); CGImageGetHeight(imageRef);デバッガが設定された直後に停止した場合、イメージの有効な値が返されますか? –

+0

@ジョアヒム:彼らは確かです。それは私がチェックした最初のものの一つでした。 :-) – Brett

答えて

2

PNG-8は8ビットのインデックス色空間を使用します。 Quartzは、CGBitmapContextのインデックス付きカラースペースをサポートしていません。 CGBitmapContextCreate documentationには、「ビットマップグラフィックスコンテキストでは、インデックス付きの色空間はサポートされていないことに注意してください。

CGBitmapContextCreateに2回目の呼び出しで色空間としてCGImageGetColorSpace(imageRef)を渡す代わりに、最初の呼び出しで使用したのと同じ色空間(colorSpace変数)を渡したいとします。

とにかくの場合でも、2番目のCGBitmapContextを作成する必要はありません。そして、あなたはCGBitmapContextCreateImageの結果を漏らしています。これを行うだけです:

- (void)modifyAlpha:(int)x and:(int)y { 

    CGImageRef imageRef = [scratchOffImage CGImage]; 
    NSUInteger width = CGImageGetWidth(imageRef); 
    NSUInteger height = CGImageGetHeight(imageRef); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    unsigned char *rawData = malloc(height * width * 4); 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * width; 
    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, 
               bitsPerComponent, bytesPerRow, colorSpace, 
               kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 

    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); 

    // Now your rawData contains the image data in the RGBA8888 pixel format. 
    int byteIndex = (bytesPerRow * y) + x * bytesPerPixel; 

    rawData[byteIndex+3] = (char) (255); //Change the pixel value 
    imageRef = CGBitmapContextCreateImage (context); 
    CGContextRelease(context); 

    UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

    CGImageRelease(imageRef); 

    scratchOffImage = rawImage; 
    [scratchOffImageView setImage:scratchOffImage]; 

    free(rawData); 

} 
関連する問題