2012-03-07 14 views
13

画像の切り抜きに問題があります。私にとってCICropフィルタは正しく動作していません。私のCIVectorのxとy(起点)がすべて正常に動作している場合(画像は左下隅から切り取られます)、画像は長方形の幅と高さで切り取られますが、CIVectorの起点(xとy)画像はスペースになります(CICropフィルタは原点(xとy)に関係なく左下隅からトリミングされるため)。私は長方形でCIImageをトリミングしていCICropでCIImageを切り捨てると、正しく動作しません。

ソース:(私は明確にするために境界線を描画)

enter image description here

:150 CIVector X 150とYとの

CIVector *cropRect =[CIVector vectorWithX:150 Y:150 Z: 300 W: 300]; 

CIFilter *cropFilter = [CIFilter filterWithName:@"CICrop"]; 

[cropFilter setValue:myCIImage forKey:@"inputImage"]; 
[cropFilter setValue:cropRect forKey:@"inputRectangle"]; 

CIImage *croppedImage = [cropFilter valueForKey:@"outputImage"]; 

出力イメージ

出力イメージとCIVector X 0とY 0:

enter image description here

オリジナル画像:

enter image description here

私が間違ってやっていますか?それともこれをすることになっていますか?

答えて

25

出力イメージは、あなたが期待しているサイズですか?どのように出力イメージを描画していますか?

フィルタフィルタは元の画像のサイズを縮小しません。不要な部分は空白にします。

あなたはおそらくこれだけ実行する必要がありたい結果を取得するには:あなたが出力として実際CIImageをしたいだけではなく、それを描く場合

[image drawAtPoint:NSZeroPoint fromRect:NSMakeRect(150, 150, 300, 300) operation:NSCompositeSourceOver fraction:1.0]; 

を、ちょうどこの操作を行います。

CIImage* croppedImage = [image imageByCroppingToRect:CGRectMake(150, 150, 300, 300)]; 

//you also need to translate the origin 
CIFilter* transform = [CIFilter filterWithName:@"CIAffineTransform"]; 
NSAffineTransform* affineTransform = [NSAffineTransform transform]; 
[affineTransform translateXBy:-150.0 yBy:-150.0]; 
[transform setValue:affineTransform forKey:@"inputTransform"]; 
[transform setValue:croppedImage forKey:@"inputImage"]; 
CIImage* transformedImage = [transform valueForKey:@"outputImage"]; 
+0

ありがとうRob!絵を描くのにはいいですが、絵を描くのではなく、CIImageが必要な場合はどうしたらいいですか? NSImageに変換するlockfocus - >画像を描く - > unlockfocus - > CIImageに変換する。うーん、私はこれが良いとは思わない、多分あなたはちょうど完全にトリミングCIImageを取得する方法を提案することができますか?あなたの助けを借りてくれてありがとう。 +1 –

+0

私は答えに 'imageByCroppingToRect:'メソッドの例を追加しました。これはあなたが望むものを実現します。 –

+0

うーん..これは私のためには、同じ問題は機能しません。私の質問を見て、私は一番下に更新コードを追加しました。忍耐ロブありがとう。 –

7

ビューの座標系は左上に、CIImageは左下にあることに注意することが重要です。これらの変換を行っているときにこれをキャッチしなければ、これはあなたを狂ってしまいます!この他の投稿では、一方向変換について説明しています:Changing CGrect value to user coordinate system

+0

それは私が私の正気を疑うようにしていた...ありがとう! – Munib

関連する問題