2012-05-08 4 views
4

:バイアスは、読み取り:C4イメージのピクセルカラーを取得しようとしていますが、イメージカラーマトリックスにアクセスするにはどうすればいいですか?色colorMatrixの議論においてc4framework

を次のように、このフィルタは、色ベクトルを変換するために、行列乗算を行う:

SR =ドット(S、redVector)SG

さまざまな色ベクトルのデータ値にアクセスする方法はありますか?(ドット、 ?

答えて

1

C4のドキュメントで言及している議論は、フィルターが行列の乗算を計算するために使用するプロセスを指します。これは実際には、フィルタが適用されたときに画像内の色に対してフィルタが何を行うかの説明です。

メソッドがCIColorMatrixというCIFilterを設定し、これをC4Imageに適用するということが実際に行われています。残念ながら、CIColorMatrixフィルタのソースコードはAppleによって提供されていません。

だから、あなたの質問にlongwinded答えは:

あなたはCIColorMatrixフィルターを通してC4Image内のピクセルの色コンポーネントにアクセスすることはできません。しかし、C4Imageクラスにはピクセルデータを取得するために使用できるCGImage(たとえばyourC4Image.CGImage)というプロパティがあります。 私はこの質問での最後の夜取りつかれ、とC4Imageクラスにこれらの2つのメソッドを追加しまっ:ロード画素データの

方法:

良い、シンプルな技術がHERE

EDITを見つけることができます

-(void)loadPixelData { 
    NSUInteger width = CGImageGetWidth(self.CGImage); 
    NSUInteger height = CGImageGetHeight(self.CGImage); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    bytesPerPixel = 4; 
    bytesPerRow = bytesPerPixel * width; 
    rawData = malloc(height * bytesPerRow); 

    NSUInteger bitsPerComponent = 8; 
    CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
    CGColorSpaceRelease(colorSpace); 
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), self.CGImage); 
    CGContextRelease(context); 
} 

画素色にアクセスするための方法:

-(UIColor *)colorAt:(CGPoint)point { 
    if(rawData == nil) { 
     [self loadPixelData]; 
    } 
    NSUInteger byteIndex = bytesPerPixel * point.x + bytesPerRow * point.y; 
    CGFloat r, g, b, a; 
    r = rawData[byteIndex]; 
    g = rawData[byteIndex + 1]; 
    b = rawData[byteIndex + 2]; 
    a = rawData[byteIndex + 3]; 

    return [UIColor colorWithRed:RGBToFloat(r) green:RGBToFloat(g) blue:RGBToFloat(b) alpha:RGBToFloat(a)]; 
} 

これは、私が言及した他の投稿から技術を適用する方法です。

関連する問題