色colorMatrix:biasの議論では、次のようになります。
このフィルターは、次のように行列の乗算を実行して、色ベクトルを変換します。
sr = dot(s、redVector)sg = dot(s、greenVector)sb = dot(s、blueVector)sa = dot(s、alphaVector)s =s+バイアス
さまざまな色ベクトルのデータ値にアクセスする方法はありますか?
色colorMatrix:biasの議論では、次のようになります。
このフィルターは、次のように行列の乗算を実行して、色ベクトルを変換します。
sr = dot(s、redVector)sg = dot(s、greenVector)sb = dot(s、blueVector)sa = dot(s、alphaVector)s =s+バイアス
さまざまな色ベクトルのデータ値にアクセスする方法はありますか?
C4のドキュメントで参照している説明は、フィルターが行列の乗算を計算するために使用するプロセスを指します。これは実際には、フィルターが適用されたときに画像の色にどのように作用するかを説明したものにすぎません。
実際、内部で起こっていることは、メソッドが呼び出さcolorMatrix:
れたものを設定し、これをに適用することです。残念ながら、フィルターのソースコードはAppleから提供されていません。CIFilter
CIColorMatrix
C4Image
CIColorMatrix
ですから、あなたの質問に対する長年の答えは次のとおりです。
フィルタC4Image
を介して、のピクセルのカラーコンポーネントにアクセスすることはできません。CIColorMatrix
ただし、このクラスには、ピクセルデータを取得するために使用できる(eg )C4Image
というプロパティがあります。CGImage
yourC4Image.CGImage
良い、簡単なテクニックはここにあります
編集:私は昨夜この質問に夢中になり、次の2つのメソッドをC4Imageクラスに追加しました:
ピクセルデータをロードする方法:
-(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)];
}
それが私が言及した他の投稿からのテクニックを適用する方法です。