2012-03-07 33 views
13

Tôi đang gặp khó khăn khi cắt xén hình ảnh. Đối với tôi, bộ lọc CICrop không hoạt động đúng cách. Nếu CIVector x và y của tôi là 0 mọi thứ hoạt động tốt (hình ảnh được cắt từ góc dưới bên trái), hình ảnh bị cắt bởi chiều rộng và chiều cao hình chữ nhật của tôi, nhưng nếu nguồn gốc CIVector (x và y) không bằng 0 hình ảnh trở thành không gian (vì bộ lọc CICrop cắt xén từ góc dưới bên trái bất kể nguồn gốc (x và y) là gì).Cắt xén CIImage bằng CICrop không hoạt động đúng cách

Tôi đang cắt xén CIImage với hình chữ nhật, nguồn:

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"]; 

Output hình ảnh với CIVector X 150 và Y 150: (Tôi vẽ biên giới cho rõ ràng)

enter image description here

Hình ảnh đầu ra với CIVector X 0 và Y 0:

enter image description here

gốc Hình ảnh:

enter image description here

Những gì tôi đang làm sai? Hoặc là nó phải làm điều này?

Trả lời

25

Bạn có chắc hình ảnh đầu ra là kích thước bạn đang mong đợi không? Bạn vẽ hình ảnh đầu ra như thế nào?

Bộ lọc CICrop không làm giảm kích thước của hình ảnh gốc, nó chỉ làm trống nội dung bạn không muốn.

Để có được kết quả bạn muốn, bạn có thể cần phải chỉ làm điều này:

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

Nếu bạn muốn một thực tế CIImage như đầu ra chứ không phải chỉ vẽ nó, chỉ cần làm điều này:

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

Cảm ơn Rob! Nó rất tốt để vẽ hình ảnh, nhưng làm thế nào để làm điều đó nếu tôi cần CIImage cắt, không phải để vẽ, nhưng CIImage. Chuyển đổi sang NSImage lockfocus -> vẽ hình ảnh -> unlockfocus -> chuyển đổi sang CIImage. Hmm Tôi nghĩ rằng điều này là không tốt, có lẽ Bạn có thể đề nghị tôi làm thế nào để có được chỉ CIImage cắt hoàn toàn? Cảm ơn bạn rất nhiều lần vì đã giúp Rob của bạn. +1 –

+0

Tôi đã thêm một ví dụ về phương thức 'imageByCroppingToRect:' vào câu trả lời của tôi, điều này sẽ đạt được những gì bạn muốn. –

+0

Hmm .. điều này không làm việc cho tôi, cùng một vấn đề. Nhìn vào câu hỏi của tôi, tôi đã thêm mã cập nhật ở dưới cùng. Cảm ơn sự kiên nhẫn Rob. –

7

Điều quan trọng cần lưu ý là hệ tọa độ của một khung nhìn là góc trên bên trái, trong khi CIImage ở dưới cùng bên trái. Điều này sẽ làm bạn phát điên nếu bạn không bắt được nó khi bạn đang thực hiện những biến đổi này! Bài đăng khác này mô tả chuyển đổi một chiều: Changing CGrect value to user coordinate system.

+0

Nó khiến tôi nghi ngờ sự tỉnh táo của tôi ... Cảm ơn! – Munib

Các vấn đề liên quan