2011-12-09 10 views
2

あなたがImageMagickののコマンドへのObjective Cの実装と同等持っていますか:アルファマスク抽出プロセスのObjective Cの実装

convert -alpha Extract -type optimize -strip -quality 60 +dither Source.png Alpha.jpg 

を私は今、どん​​な解決策を見つけることができませんでした。 私はマスクは、コードスニペットを使用して作成されたPNGからアルファを抽出し、JPGグレースケール

に保存しますAlphaExtractorスニペットを探してい:

CGImageRef createMaskWithImage(CGImageRef image) 
{ 
    int maskWidth    = CGImageGetWidth(image); 
    int maskHeight    = CGImageGetHeight(image); 
    // round bytesPerRow to the nearest 16 bytes, for performance's sake 
    int bytesPerRow    = (maskWidth + 15) & 0xfffffff0; 
    int bufferSize    = bytesPerRow * maskHeight; 

    // we use CFData instead of malloc(), because the memory has to stick around 
    // for the lifetime of the mask. if we used malloc(), we'd have to 
    // tell the CGDataProvider how to dispose of the memory when done. using 
    // CFData is just easier and cleaner. 

    CFMutableDataRef dataBuffer = CFDataCreateMutable(kCFAllocatorDefault, 0); 
    CFDataSetLength(dataBuffer, bufferSize); 

    // the data will be 8 bits per pixel, no alpha 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericGray);//CGColorSpaceCreateDeviceGray(); 
    CGContextRef ctx   = CGBitmapContextCreate(CFDataGetMutableBytePtr(dataBuffer), 
                 maskWidth, maskHeight, 
                 8, bytesPerRow, colorSpace, kCGImageAlphaNone); 
    // drawing into this context will draw into the dataBuffer. 
    CGContextDrawImage(ctx, CGRectMake(0, 0, maskWidth, maskHeight), image); 
    CGContextRelease(ctx); 

    // now make a mask from the data. 
    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(dataBuffer); 
    CGImageRef mask     = CGImageMaskCreate(maskWidth, maskHeight, 8, 8, bytesPerRow, 
                 dataProvider, NULL, FALSE); 

    CGDataProviderRelease(dataProvider); 
    CGColorSpaceRelease(colorSpace); 
    CFRelease(dataBuffer); 

    return mask; 
} 

と保存:

CGContextDrawImage(ctx, CGRectMake(0, 0, maskWidth, maskHeight), image); 

が抽出されていません。

答えて

0

私は2つの問題を参照してくださいアルファ、それは黒い背景に画像をアルファ合成するだけです。 イメージが透明で黒い場合は、すべて黒のイメージが予想される出力になります。

と:

CGImageRef mask = CGImageMaskCreate(maskWidth, maskHeight, 8, 8, bytesPerRow, 
            dataProvider, NULL, FALSE); 

あなたは本物の画像のように作成し、このマスクを処理しています。私たちは生の32バイト持っていると仮定すると、

:あなたは

CGImageRef mask = CGImageCreate(maskWidth, maskHeight, 8, 8, bytesPerRow, colorSpace, 0, 
           dataProvider, NULL, FALSE, kCGRenderingIntentDefault); 

でこの行を置き換えた場合、あなたはあなたのイメージのグレースケールバージョンを取得します

+0

どうすれば問題を解決できますか? – bpds

+0

私は確かではありませんが、誰かがもっと知っていない限り、少し後で遊んでみるつもりです。 – cobbal

+0

私は解決策を見つけました – bpds

1

A本当に迅速な汚い作業溶液(問題1を参照)データ(コードを適合させる必要がない場合)

1バイトを+4ステップで繰り返し、r、g、b成分を変更します。

CGImageRef ref=CGImageCreateCopy([_imageView image]); 
NSData *data  = (NSData *)CGDataProviderCopyData(CGImageGetDataProvider(ref)); 
char *bytes  = (char *)[data bytes]; 

int i; 
for(i= 0; i < [data length]; i += 4) 
{ 
    int r = i; 
    int g = i+1; 
    int b = i+2; 
    int a = i+3; 

    bytes[r] = 0; 
    bytes[g] = 0; 
    bytes[b] = 0; 
    bytes[a] = bytes[a]; 
} 

2-我々は、 "変更データ" と新しいRGBA(32ビット)画像基準作成:

size_t width     = CGImageGetWidth(ref); 
size_t height     = CGImageGetHeight(ref); 
size_t bitsPerComponent   = CGImageGetBitsPerComponent(ref); 
size_t bitsPerPixel    = CGImageGetBitsPerPixel(ref); 
size_t bytesPerRow    = CGImageGetBytesPerRow(ref); 

CGColorSpaceRef colorspace  = CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo   = CGImageGetBitmapInfo(ref); 
CGDataProviderRef provider  = CGDataProviderCreateWithData(NULL,bytes, [data length], NULL); 

CGImageRef newImageRef = CGImageCreate (
             width, 
             height, 
             bitsPerComponent, 
             bitsPerPixel, 
             bytesPerRow, 
             colorspace, 
             bitmapInfo, 
             provider, 
             NULL, 
             false, 
             kCGRenderingIntentDefault 
             ); 

3-我々は、JPEGファイルにこの新しい32バイトの画像参照を保存します。 生成されたJPGはマスクとして使用できます。

8Bitコンテキストを作成し、「アルファコンポーネント」のみを記述することで、よりクリーンな方法で行うことができます。

関連する問題