1. 程式人生 > >iOS一種高斯模糊漸變動畫的實現

iOS一種高斯模糊漸變動畫的實現

關於高斯模糊的方式有很多種,但是如果需要模糊漸變,那麼對這種高斯模糊演算法的效能要求是比較高的,今天這裡重點不討論演算法,只是提供一個動畫實現的思路。動畫效果如下:
這裡寫圖片描述

高斯模糊漸變動畫

//高斯模糊
-(UIImage )boxblurImage:(UIImage )image withBlurNumber:(CGFloat)blur {
if (blur < 0.f || blur > 1.f) {
blur = 0.5f;
}
int boxSize = (int)(blur * 250);
boxSize = boxSize - (boxSize % 2) + 1;
CGImageRef img = image.CGImage;
vImage_Buffer inBuffer, outBuffer;
vImage_Error error;
void *pixelBuffer; //從CGImage中獲取資料
CGDataProviderRef inProvider = CGImageGetDataProvider(img); CFDataRef inBitmapData = CGDataProviderCopyData(inProvider); //設定從CGImage獲取物件的屬性
inBuffer.width = CGImageGetWidth(img);
inBuffer.height = CGImageGetHeight(img);
inBuffer.rowBytes = CGImageGetBytesPerRow(img);
inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
if(pixelBuffer == NULL)
NSLog(@”No pixelbuffer”);
outBuffer.data = pixelBuffer;
outBuffer.width = CGImageGetWidth(img);
outBuffer.height = CGImageGetHeight(img);
outBuffer.rowBytes = CGImageGetBytesPerRow(img);
error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend); if (error) { NSLog(@”error from convolution %ld”, error);
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate( outBuffer.data, outBuffer.width, outBuffer.height, 8, outBuffer.rowBytes, colorSpace, kCGImageAlphaNoneSkipLast); CGImageRef imageRef = CGBitmapContextCreateImage (ctx); UIImage *returnImage = [UIImage imageWithCGImage:imageRef]; //clean up CGContextRelease(ctx);
CGColorSpaceRelease(colorSpace);
free(pixelBuffer);
CFRelease(inBitmapData);
CGColorSpaceRelease(colorSpace);
CGImageRelease(imageRef);
return returnImage;
}

高斯模糊漸變

自動漸變的過程需要加入一個定時器NSTimer,並且迴圈。每0.1秒迴圈一次,通過一個變數來計數,以改變blur值。當然,這裡的引數根據需要來調整來滿足不同的需求。

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(changeImageView1) userInfo:nil repeats:YES];
-(void)changeImageView1 {
self.imageView1.image = [self boxblurImage:[UIImage imageNamed:@”login_bg_1”] withBlurNumber:self.count1/50.0];
if (self.count1++ == 15) {
[self.timer1 invalidate];
self.timer1 = nil;
self.count1 = 0;
self.imageView2.image = [UIImage imageNamed:@”login_bg_2”];
[UIView animateWithDuration:2 animations:^{
self.imageView1.alpha = 0;
self.imageView2.alpha = 1;
} completion:^(BOOL finished) {
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(imageView2AnimationStart) userInfo:nil repeats:NO];
}]; }
}

動畫過渡

在第一張圖片模糊到一定程度時,對其做漸變處理,改變其alpha值(從1到0),同時讓第二張圖顯現出來(從1到0)。至此,整個動畫就基本完成了。
另外

需要對其他方面做些優化,比如NSTimer的開啟與暫停,以及切換到其他頁面後需要關閉定時器等。