一種高斯模糊漸變動(dòng)畫的實(shí)現(xiàn)

關(guān)于高斯模糊的方式有很多種,但是如果需要模糊漸變,那么對(duì)這種高斯模糊算法的性能要求是比較高的,今天這里重點(diǎn)不討論算法,只是提供一個(gè)動(dòng)畫實(shí)現(xiàn)的思路。動(dòng)畫效果如下:


高斯模糊漸變動(dòng)畫

高斯模糊

-(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中獲取數(shù)據(jù)
    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
    //設(shè)置從CGImage獲取對(duì)象的屬性
    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;
}

高斯模糊漸變

自動(dòng)漸變的過(guò)程需要加入一個(gè)定時(shí)器NSTimer,并且循環(huán)。每0.1秒循環(huán)一次,通過(guò)一個(gè)變量來(lái)計(jì)數(shù),以改變blur值。當(dāng)然,這里的參數(shù)根據(jù)需要來(lái)調(diào)整來(lái)滿足不同的需求。

[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];
        }];
    }
}

動(dòng)畫過(guò)渡

在第一張圖片模糊到一定程度時(shí),對(duì)其做漸變處理,改變其alpha值(從1到0),同時(shí)讓第二張圖顯現(xiàn)出來(lái)(從1到0)。至此,整個(gè)動(dòng)畫就基本完成了。

另外

需要對(duì)其他方面做些優(yōu)化,比如NSTimer的開啟與暫停,以及切換到其他頁(yè)面后需要關(guān)閉定時(shí)器等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,192評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,430評(píng)論 4 61
  • 文&圖 | 小豬 一直相信真正愛(ài)吃的人,即使再懶也總是會(huì)愿意自己倒騰點(diǎn)吃的。 畢竟餐廳不總是好吃,外賣不總是放心,...
    貓小豬閱讀 669評(píng)論 0 7
  • 無(wú)意中問(wèn)了你,感覺(jué)現(xiàn)在和以前不一樣了,以前有什么聊什么?,F(xiàn)在呢,沒(méi)有那種感覺(jué)了。你哈哈回答到:以前是你傻,我陪你一...
    我今年22歲閱讀 684評(píng)論 0 1
  • ——談時(shí)間管理 小時(shí)候,喜歡聽羅大佑唱《光陰的日子》,對(duì)流水一般的光陰,幾多懷念,幾多無(wú)奈,流光美好且無(wú)情,既然無(wú)...
    emma佳小佳閱讀 201評(píng)論 0 0

友情鏈接更多精彩內(nèi)容