2011-12-16 25 views
22

Theo các tài liệu cần hỗ trợ làm mờ, lưu ý "Có sẵn trong iOS 5.0 trở về sau":iOS 5 có hỗ trợ làm mờ các bộ điều hợp CoreImage không?

CIFilter Class Reference

Nhưng theo thiết bị, nó không:

[CIFilter filterNamesInCategory:kCICategoryBlur]; 

lợi nhuận không có gì.

Theo chỉ các bộ lọc sau đây có sẵn trên iPhone và Simulator của tôi (mà đều chạy 5.0):

[CIFilter filterNamesInCategory:kCICategoryBuiltIn] 

CIAdditionCompositing, 
CIAffineTransform, 
CICheckerboardGenerator, 
CIColorBlendMode, 
CIColorBurnBlendMode, 
CIColorControls, 
CIColorCube, 
CIColorDodgeBlendMode, 
CIColorInvert, 
CIColorMatrix, 
CIColorMonochrome, 
CIConstantColorGenerator, 
CICrop, 
CIDarkenBlendMode, 
CIDifferenceBlendMode, 
CIExclusionBlendMode, 
CIExposureAdjust, 
CIFalseColor, 
CIGammaAdjust, 
CIGaussianGradient, 
CIHardLightBlendMode, 
CIHighlightShadowAdjust, 
CIHueAdjust, 
CIHueBlendMode, 
CILightenBlendMode, 
CILinearGradient, 
CILuminosityBlendMode, 
CIMaximumCompositing, 
CIMinimumCompositing, 
CIMultiplyBlendMode, 
CIMultiplyCompositing, 
CIOverlayBlendMode, 
CIRadialGradient, 
CISaturationBlendMode, 
CIScreenBlendMode, 
CISepiaTone, 
CISoftLightBlendMode, 
CISourceAtopCompositing, 
CISourceInCompositing, 
CISourceOutCompositing, 
CISourceOverCompositing, 
CIStraightenFilter, 
CIStripesGenerator, 
CITemperatureAndTint, 
CIToneCurve, 
CIVibrance, 
CIVignette, 
CIWhitePointAdjust 
+2

Tài liệu cho biết rằng hằng số 'kCICategoryBlur' có sẵn. Bạn đã sử dụng thành công trong '[CIFilter filterNamesInCategory: kCICategoryBlur];'. Mà nói với bạn không có bộ lọc mờ có sẵn tại thời điểm đó. – idz

+1

@idz Điều đó khiến tôi cười, cảm ơn! – lms

Trả lời

5

Thật không may, nó không hỗ trợ bất kỳ mờ. Để làm được điều đó, bạn sẽ phải tự cuộn.

23

Tôi cũng thất vọng khi thấy rằng Core Image trong iOS không hỗ trợ làm mờ. Đây là hàm tôi đã viết để thực hiện cú nhấp Gaussian 9 lần nhấn trên UIImage. Gọi nó lặp đi lặp lại để có những vết mờ mạnh hơn.

@interface UIImage (ImageBlur) 
- (UIImage *)imageWithGaussianBlur9; 
@end 

@implementation UIImage (ImageBlur) 
- (UIImage *)imageWithGaussianBlur9 { 
    float weight[5] = {0.2270270270, 0.1945945946, 0.1216216216, 0.0540540541, 0.0162162162}; 
    // Blur horizontally 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]]; 
    for (int x = 1; x < 5; ++x) { 
     [self drawInRect:CGRectMake(x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]]; 
     [self drawInRect:CGRectMake(-x, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[x]]; 
    } 
    UIImage *horizBlurredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    // Blur vertically 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    [horizBlurredImage drawInRect:CGRectMake(0, 0, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[0]]; 
    for (int y = 1; y < 5; ++y) { 
     [horizBlurredImage drawInRect:CGRectMake(0, y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]]; 
     [horizBlurredImage drawInRect:CGRectMake(0, -y, self.size.width, self.size.height) blendMode:kCGBlendModePlusLighter alpha:weight[y]]; 
    } 
    UIImage *blurredImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    // 
    return blurredImage; 
} 

Chỉ cần gọi nó trên một hình ảnh hiện như thế này:

UIImage *blurredImage = [originalImage imageWithGaussianBlur9]; 

và lặp lại nó để có được làm mờ mạnh mẽ hơn, như thế này:

blurredImage = [blurredImage imageWithGaussianBlur9]; 
+5

Giải pháp phụ thuộc rất thấp –

25

Một lần nữa, trong một nỗ lực để lưu tất cả iOS blur isses, đây là đóng góp của tôi:

https://github.com/tomsoft1/StackBluriOS

Thư viện mờ đơn giản dựa trên Stack Blur. Ngăn xếp Blur rất giống với Gaussian Blur, nhưng nhanh hơn nhiều (xem http://incubator.quasimondo.com/processing/fast_blur_deluxe.php)

sử dụng nó như thế này:

UIImage *newIma=[sourceIma stackBlur:radius] 

Hy vọng điều này giúp đỡ

+0

Tôi đã triển khai ứng dụng của riêng mình và ứng dụng đã xuất hiện trên cửa hàng ứng dụng, nhưng tôi sẽ ghi nhớ điều đó để tham khảo trong tương lai. Cảm ơn vì tiền hỗ trợ! – lms

+0

StackBlur iOS xoay hình ảnh 90 độ. Tôi nghĩ rằng nó nên được sửa chữa – ppaulojr

+0

@ppaulojr bạn có chắc chắn về vấn đề xoay? Nó nên giữ tất cả các thông số khác giống hệt nhau. Nếu bạn vẫn gặp sự cố, vui lòng cung cấp hình ảnh mẫu có vấn đề với mã kiểm tra – tomsoft

31

lọc Trong khi Lõi hình ảnh trên iOS 5.0 thiếu các mờ, có vẫn là một cách để làm mờ các hình ảnh và video được tăng tốc GPU. Khung nguồn mở của tôi GPUImage có nhiều loại mờ, bao gồm Gaussian (sử dụng GPUImageGaussianBlurFilter cho một Gaussian chung hoặc GPUImageFastBlurFilter cho hộp Gauss 9-hit được tối ưu hóa bằng phần cứng), hộp (sử dụng GPUImageBoxBlurFilter), trung bình (sử dụng GPUImageMedianFilter) và mờ hai mặt (sử dụng GPUImageBilateralBlurFilter).

Tôi mô tả các trình đổ bóng được sử dụng để tắt mờ Gaussian được tối ưu hóa phần cứng trong this answer và bạn có thể kiểm tra mã mà tôi sử dụng cho phần còn lại trong khung. Các bộ lọc này chạy nhanh hơn hàng chục lần so với bất kỳ thường trình CPU nào mà tôi đã thử.

Tôi cũng kết hợp các hiệu ứng xử lý nhiều giai đoạn, như mặt nạ unsharp, lọc độ nghiêng, phát hiện cạnh Canny và phát hiện góc Harris, tất cả đều có sẵn dưới dạng bộ lọc trong khung này.

+0

+1 trông giống như một thư viện tuyệt vời – lms

+0

Brad, bạn thật tuyệt vời khi thư viện thật tuyệt vời! một sự xấu hổ mà tôi không thể bỏ phiếu nhiều hơn một lần. – Raspu

4

CẬP NHẬT: Kể từ iOS 6 [CIFilter filterNamesInCategory:kCICategoryBlur]; trả về CIGaussianBlur có nghĩa là bộ lọc này khả dụng trên thiết bị. Mặc dù điều này là đúng, bạn (có thể) sẽ có hiệu suất tốt hơn và linh hoạt hơn khi sử dụng GPUImage.

+0

Tôi đã tìm thấy CIFilter blur rất không ổn định. Thỉnh thoảng, nó gây ra một vụ tai nạn cực kỳ kỳ lạ trên iPad của tôi mà khóa màn hình, nhưng tôi có thể nói cho iPad vẫn còn hoạt động vì tôi có thể nghe thấy âm thanh khi nó phản ứng với chạm. Tôi phải thiết lập lại khó khăn để sửa chữa nó. Dù sao, việc thay thế drop-in của John Stephan ở trên là một giải pháp tuyệt vời. –

0

Nếu bạn có thể sử dụng OpenGL ES trong ứng dụng iOS của bạn, đây là cách bạn tính toán trung bình trong bán kính khu phố điểm ảnh lựa chọn của bạn (trung bình là một loại mờ, tất nhiên):

kernel vec4 medianUnsharpKernel(sampler u) { 
vec4 pixel = unpremultiply(sample(u, samplerCoord(u))); 
vec2 xy = destCoord(); 
int radius = 3; 
int bounds = (radius - 1)/2; 
vec4 sum = vec4(0.0); 
for (int i = (0 - bounds); i <= bounds; i++) 
{ 
    for (int j = (0 - bounds); j <= bounds; j++) 
    { 
     sum += unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); 
    } 
} 
vec4 mean = vec4(sum/vec4(pow(float(radius), 2.0))); 
float mean_avg = float(mean); 
float comp_avg = 0.0; 
vec4 comp = vec4(0.0); 
vec4 median = mean; 
for (int i = (0 - bounds); i <= bounds; i++) 
{ 
    for (int j = (0 - bounds); j <= bounds; j++) 
    { 
     comp = unpremultiply(sample(u, samplerTransform(u, vec2(xy + vec2(i, j))))); 
     comp_avg = float(comp); 
     median = (comp_avg < mean_avg) ? max(median, comp) : median; 
    } 
} 

return premultiply(vec4(vec3(abs(pixel.rgb - median.rgb)), 1.0)); 
} 

Mô tả ngắn gọn các bước 1. Tính giá trị trung bình của các pixel xung quanh pixel nguồn trong vùng lân cận 3x3; 2. Tìm giá trị pixel tối đa của tất cả các pixel trong cùng một vùng lân cận nhỏ hơn giá trị trung bình. 3. [TÙY CHỌN] Trừ giá trị pixel trung bình khỏi giá trị pixel nguồn để phát hiện cạnh.

Nếu bạn đang sử dụng giá trị trung bình để phát hiện cạnh, có một số cách để sửa đổi mã ở trên để có kết quả tốt hơn, cụ thể là lọc trung gian kết hợp và lọc phương tiện cắt ngắn (bộ lọc thay thế và chế độ 'tốt hơn'). Nếu bạn quan tâm, hãy hỏi.

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