1. 程式人生 > >iOS中直接使用Gif圖片

iOS中直接使用Gif圖片

今天有兩個朋友問我如何直接在iOS中使用GIF圖片,查了下咱們的度娘看到了簡單的方法就是直接使用webView來載入。webView的好處在於每個subFrame之間的delay可以按照圖片的設定顯示出來。

還有個辦法就是使用定時器模擬幀數,使用imageIO流來讀取GIF的data。

我也嘗試寫個Demo來顯示Gif

在demo中首先先分解出GIF的每個image,之後使用UIView動畫來重現效果,在這個中使用了1/100秒作為一針

主體程式碼如下:

- (void)loadImageData {
    // 將所有的子幀動畫加入陣列
    NSMutableArray *array = [[NSMutableArray alloc] init];
    for (int i = 0; i < [GIF_frames count]; i++)
    {
        [array addObject: [self getFrameAsImageAtIndex:i]];
    }
    
    NSMutableArray *overlayArray = [[NSMutableArray alloc] init];
    UIImage *firstImage = [array objectAtIndex:0];
    CGSize size = firstImage.size;
    CGRect rect = CGRectZero;
    rect.size = size;
    
    //獲取當前的上下文
    UIGraphicsBeginImageContext(size);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    int i = 0;
    AnimatedGifFrame *lastFrame = nil;
    for (UIImage *image in array)
    {
        // 獲取
        AnimatedGifFrame *frame = [GIF_frames objectAtIndex:i];
        
        //當前的展示
        UIImage *previousCanvas = nil;
        
        //將當前圖形狀態推入堆疊
        CGContextSaveGState(ctx);
        // 縮放比例(上下文,x的比例,y的比例(需使用負值),因為cgcontext的原點與uiview不同)
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextTranslateCTM(ctx, 0.0, -size.height);
        
        // 顯示的大小
        CGRect clipRect;
        
        // 判斷是哪種顯示方法
        switch (frame.disposalMethod)
        {
            case 1: // 是否超邊了
                // 顯示的大小
                clipRect = CGRectMake(frame.area.origin.x, size.height - frame.area.size.height - frame.area.origin.y, frame.area.size.width, frame.area.size.height);
                
                CGContextClipToRect(ctx, clipRect);
                break;
            case 2:
                clipRect = CGRectMake(frame.area.origin.x, size.height - frame.area.size.height - frame.area.origin.y, frame.area.size.width, frame.area.size.height);
            
                CGContextClipToRect(ctx, clipRect);
                break;
            case 3:
                // 獲取畫板
                previousCanvas = UIGraphicsGetImageFromCurrentImageContext();
                
           
                clipRect = CGRectMake(frame.area.origin.x, size.height - frame.area.size.height - frame.area.origin.y, frame.area.size.width, frame.area.size.height);
                // Clip Context
                CGContextClipToRect(ctx, clipRect);
                break;
        }
        
        // 繪製實際圖片實際大小
        CGContextDrawImage(ctx, rect, image.CGImage);
        // 重新渲染
        CGContextRestoreGState(ctx);
        
        //延遲時間要大於等於0
        if (frame.delay <= 0) {
            frame.delay = 10;
        }
        [overlayArray addObject:UIGraphicsGetImageFromCurrentImageContext()];
        
        // 設定最後顯示大小
        lastFrame = frame;
        
        //
        switch (frame.disposalMethod)
        {
            case 2:
                CGContextSaveGState(ctx);
               
                CGContextScaleCTM(ctx, 1.0, -1.0);
                CGContextTranslateCTM(ctx, 0.0, -size.height);
                // 清除上下文
                CGContextClearRect(ctx, clipRect);
                // 重設上下文
                CGContextRestoreGState(ctx);
                break;
            case 3:
                CGContextSaveGState(ctx);
                
                CGContextScaleCTM(ctx, 1.0, -1.0);
                CGContextTranslateCTM(ctx, 0.0, -size.height);
              
                CGContextClearRect(ctx, lastFrame.area);
                
                CGContextDrawImage(ctx, rect, previousCanvas.CGImage);
               
                CGContextRestoreGState(ctx);
                break;
        }
        
       
        i++;
    }
    UIGraphicsEndImageContext();
    
    [self setImage:[overlayArray objectAtIndex:0]];
    [self setAnimationImages:overlayArray];
    
   
    
  //gif總共播放時間
    double total = 0;
    for (AnimatedGifFrame *frame in GIF_frames) {
        total += frame.delay;
    }
    
    // gif的針數大概為1/100一秒
    // UIImage來播放
    [self setAnimationDuration:total/100];
    
    // 設定是否迴圈
    [self setAnimationRepeatCount:0];
    
    [self startAnimating];
}
github位置:點選開啟連結

裡面使用了很多c語言,主要就是拿來判斷是否為gif,和解析gif

相關推薦

iOS直接使用Gif圖片

今天有兩個朋友問我如何直接在iOS中使用GIF圖片,查了下咱們的度娘看到了簡單的方法就是直接使用webView來載入。webView的好處在於每個subFrame之間的delay可以按照圖片的設定顯示出來。 還有個辦法就是使用定時器模擬幀數,使用imageIO流來讀取GIF

iOS開發技巧之:相簿GIF圖片的讀取與儲存

大家都知道iOS的系統相簿是不支援gif圖片預覽的。但是,這並不代表系統相簿不能儲存和讀取gif圖片。通過Safari長按gif圖片,選擇儲存到相簿,這時儲存到相簿裡的圖片就是gif的,雖然它不會動。 下面將介紹如何對系統相簿進行gif的讀取與儲存。 什麼是 UTI iOS系統相

MFC新增GIF圖片

1、下載上述文章中的軟體包,將其中的PictureEx.h,PictureEx.cpp這兩個檔案新增到工程中。 2、在對話方塊控制元件上新增Picture Control(圖片控制元件),修改其屬性:ID(TYPE:選Rectangle),不修改的話,ClassWiard不能新增CSatic控制變數,修改

unity 播放GIF圖片

using System.Drawing;using System.Drawing.Imaging;using UnityEngine;using System.Collections;using System.Collections.Generic;public class AnimatedGifDrawe

iOS如何把圖片存放入SQLite資料庫

有時候我們需要把一些圖片檔案存放到本地,當然可以直接存入沙盒路徑下;這裡想到另外的方法,就是直接將圖片資料存到資料庫中(只是想實現一下,不是很方便,建議不要用,可以把圖片存入沙盒,然後把儲存路徑存入資料庫,這樣比較合理)。 這樣對於包含圖片資訊的列表形式的資料的儲存就方便多

PS修改gif圖片遇到的問題

ps gif圖片 播放完了會閃一下?     檢查後發現最後多了幾個空白幀,刪除儲存就好了。 為什麼用PS做的GIF圖,預覽時候動,儲存成GIF的就不動了? 首先看你是不是設定了多個幀,其次要看你是不是每一幀都顯示的一個不同的圖層,如果這都沒有問題播放動畫看看是有是動

ios播放gif動畫

轉自:http://blog.csdn.net/lovenjoe/article/details/7487142 iPhone SDK提供了多種動畫手段,UIView、UIImageView和CALayer都支援動畫。但如何處理常見的gif動畫呢?UIWebView提供了

如何在MySQL資料庫直接儲存圖片

c  本文概述:   在mysql中建立一個新的資料庫   一個怎樣儲存檔案的例子程式   一個怎樣訪問檔案的例子程式   在mysql中建立一個新的database   首先,你必須在你的mysql中建立一個新的資料庫,我們將會把那些二進位制檔案儲存在這個資料庫裡。在例子中

LaTeX 插入GIF圖片

參見博文:liam.page 和 voidcn 前提條件 安裝 ImageMagick 軟體 (因為要把 gif 圖片轉換成 png 序列),使用它的命令列工具 convert.exe 命令列下把 gif 轉換成 png 序列,實際,例如 convert latex_demo.gif -coalesce o

iOSGIF圖片的載入

Gif圖片是非常常見的圖片格式,尤其是在聊天的過程中,Gif表情使用地很頻繁。但是iOS竟然沒有現成的支援載入和播放Gif的類。 簡單的上網搜了一下,大概有三種方法: 1、使用UIWebView // 讀取gif圖片資料 NSData *data = [NS

linux下,將一個目錄圖片文件合成為gif圖片

linux span depth 合成 linux下 bsp col spa 目錄 # {0} 為文件所在目錄位置 # {1} 為gif圖片位置 convert -delay 30 -depth 8 -layers optimize -quality 80 -loop 0

AndroidGif圖片的顯示

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

在markdown直接插入base64編碼的圖片

經常寫一些東西,但是一直被如何分享與遷移這些東西困擾。比如從onenote和word沒辦法快速的釋出到csdn(本來有介面的,但是csdn現在不提供了)。釋出到csdn的內容不能直接完整的複製下來繼續編輯,格式會完全亂掉。 markdown是一個不錯的答案,以文字的方式表達格式,走到哪都

iOS開發技巧之:獲取ios相簿gif圖片 原資料

<AssetsLibrary/AssetsLibrary.h> 從Safari上儲存了一張動態GIF到本地的相簿中可以確定,儲存到本地相簿的動態GIF沒有問題,只是iPhone的相簿不能顯示動態GIF然後在自己的應用中,要可以選擇GIF圖片上傳到伺服器用UIImagePickerCo

IOS各種圖片大小尺寸彙總

  IOS中各種圖片大小尺寸彙總 Table 8-1  Size (in pixels) of custom icons and images

讓富文字編輯器支援複製doc多張圖片直接貼上上傳

Chrome+IE預設支援貼上剪下板中的圖片,但是我要釋出的文章存在word裡面,圖片多達數十張,我總不能一張一張複製吧? 我希望開啟文件doc直接複製貼上到富文字編輯器,直接釋出   感覺這個似乎很困難,因為Ueditor本身不支援,粘貼後直接就是空白,這裡面一定有原因。 好,開始嘗試UM

Nginx設定Laravel專案圖片防盜鏈以及禁止位址列直接訪問圖片

為了防止圖片盜用,禁止外鏈以及禁止位址列直接訪問圖片是必不可少的方案,當然這樣的限制還比較基礎,還是有別的途徑可以盜圖的,更多的限制之後會追加,現在先做好這兩個基礎防護。 location ~ .*\.

iOS view上直接新增圖片

UIImage*image = [UIImageimageNamed:@"bg"]; view.layer.contents = (__bridge id)image.CGImage; /** 設定對齊模式*/ view.layer.contentsGravity =

Python - pyecharts:直接圖片儲存為 png, pdf, gif 格式的檔案

關鍵:使用 pyecharts-snapshot外掛 第一步:安裝node.js 第二步:安裝phantomjs 命令列中輸入: npm install -g phantomjs-prebuilt 安裝完成後檢查是否成功,命令列輸入: phantomjs 第三

IOS快速刪除專案工程不用的圖片資源

在開發中,由於種種原因我們工程中必不可少的存在很多用不到的圖片資源,久而久之,使得工程的包檔案越來越大,如果一張張的查詢清理,這樣處理很麻煩,現在我推薦給大家一個方法,不到3分鐘,就能清理所有的用不到的圖片資源. 首先先去下載一個大牛寫的mac應用,執行開啟,傳送門. 1.開啟應用就會顯示這