1. 程式人生 > >iOS中GIF圖片的載入

iOS中GIF圖片的載入

Gif圖片是非常常見的圖片格式,尤其是在聊天的過程中,Gif表情使用地很頻繁。但是iOS竟然沒有現成的支援載入和播放Gif的類。

簡單的上網搜了一下,大概有三種方法:

1、使用UIWebView

    // 讀取gif圖片資料
    NSData *data = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"001" ofType:@"gif"]];    
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,200
,200)]; [webView loadData:data MIMEType:@"image/gif" textEncodingName:nil baseURL:nil]; [self.view addSubview:webView];

但是使用UIWebView的弊端在於,不能設定Gif動畫的播放時間。

2、將Gif拆分成多張圖片,使用UIImageView播放

最好把所需要的Gif圖片打包到Bundle檔案內,如下圖所示


Loading.png
- (NSArray *)animationImages
{
    NSFileManager *fielM = [NSFileManager
defaultManager]; NSString *path = [[NSBundle mainBundle] pathForResource:@"Loading" ofType:@"bundle"]; NSArray *arrays = [fielM contentsOfDirectoryAtPath:path error:nil]; NSMutableArray *imagesArr = [NSMutableArray array]; for (NSString *name in arrays) { UIImage *image = [UIImage
imageNamed:[(@"Loading.bundle") stringByAppendingPathComponent:name]]; if (image) { [imagesArr addObject:image]; } } return imagesArr; } - (void)viewDidLoad { [super viewDidLoad]; UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:frame]; gifImageView.animationImages = [self animationImages]; //獲取Gif圖片列表 gifImageView.animationDuration = 5; //執行一次完整動畫所需的時長 gifImageView.animationRepeatCount = 1; //動畫重複次數 [gifImageView startAnimating]; [self.view addSubview:gifImageView]; }

3、使用SDWebImage

但是很遺憾,SDWebImage這個方法是不能播放Gif的,它只能顯示Gif的第一張圖片而已。So,此方法被KO

    UIImageView *gifImageView = [[UIImageView alloc] initWithFrame:frame];
    [gifImageView sd_setImageWithURL:nil placeholderImage:[UIImage imageNamed:@"gifTest.gif"]];

其實,在SDWebImage這個庫裡有一個UIImage+GIF的類別,裡面為UIImage擴充套件了三個方法:

@interface UIImage (GIF)
+ (IImage *)sd_animatedGIFNamed:(NSString *)name;
+ (UIImage *)sd_animatedGIFWithData:(NSData *)data;
- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size;
@end

大家一看就知道,我們要獲取處理後的Gif圖片,其實只要呼叫前面兩個中的其中一個方法就行了

注意:第一個只需要傳Gif的名字,而不需要帶副檔名(如Gif圖片名字為[email protected],只需傳001即可)


我們就使用第二個方法試一試效果:

    NSString *path = [[NSBundle mainBundle] pathForResource:@"gifTest" ofType:@"gif"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    UIImage *image = [UIImage sd_animatedGIFWithData:data];
    gifImageView.image = image;

然後通過斷點,我們看下獲取到的image是個什麼樣的東東:


img.png

我們發現:

image的isa指標指向了_UIAnimatedImage ,說明它是一個叫作_UIAnimatedImage 的類(當然,這個_UIAnimatedImage 蘋果是不會直接讓我們使用的)
_images 表示:這個Gif包含了多少張圖片
_duration表示:執行一次完整動畫所需的時長

其實,動畫執續時間_duration也可以更改!
我們來看下此方法的內部實現:

+ (UIImage *)sd_animatedGIFWithData:(NSData *)data {
    if (!data) {
        return nil;
    }

    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

    size_t count = CGImageSourceGetCount(source);

    UIImage *animatedImage;

    if (count <= 1) {
        animatedImage = [[UIImage alloc] initWithData:data];
    }
    else {
        NSMutableArray *images = [NSMutableArray array];

        NSTimeInterval duration = 0.0f;

        for (size_t i = 0; i < count; i++) {
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);

            duration += [self sd_frameDurationAtIndex:i source:source];

            [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];

            CGImageRelease(image);
        }

        if (!duration) {
            duration = (1.0f / 10.0f) * count;
        }

        animatedImage = [UIImage animatedImageWithImages:images duration:duration];
    }

    CFRelease(source);

    return animatedImage;
}

很明顯,duration是可以隨意更改的,只不過此方法設定了一個預設值
(duration = (1.0f / 10.0f) * count)

歸根到底,建立新的動態的Image其實是呼叫了系統提供的一個UIImage的類方法而已:

 UIImage *animatedImage = [UIImage animatedImageWithImages:images duration:duration];

總結

1、使用UIWebView不可以設定duration,其他兩種方法都可設定。而且方法1的容器為UIWebView ,其餘兩種的容器都是大家熟悉的UIImageView
2、方法2和方法3需要對應看應用場景

如:下拉、上拉載入控制元件需要一個根據拉動距離設定特定的Image,則需要使用方法2
直接顯示Gif圖片,則使用方法3會更方便



文/鏡花水月_I(簡書作者)
原文連結:http://www.jianshu.com/p/f0530a75c7af
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。

相關推薦

iOSGIF圖片載入

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

iOS 如何計算圖片載入記憶體所佔的大小

首先圖片自動縮放到2的n次方大小,例如200 * 300畫素 會變成256 * 512大小。 圖片記憶體大小的計算公式 寬度 * 高度 * bytesPerPixel/8。 bytesPerPixel : 每個畫素所佔的位元組數。 RGB顏色空間下 每個顏色分量由8位組成

vue圖片載入與顯示預設圖片

  原部落格地址:https://www.cnblogs.com/xulei1992/p/6558294.html     <div class="content-show-img">  <div class="show-img">    <img cl

AndroidGif圖片的顯示

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

BitmapFactory.decodeStream方法及如何將Raw圖片載入為Bitmap

結論 將輸入流傳遞給 BitmapFactory.decodeStream(in) 方法,建立完成 Bitmap 之後,開發者一定要主動去關閉這個輸入流。否則,對輸入流執行 reset() 方法,則可以重新獲取輸入流中的所有資料,並且創建出一張新的圖片。 從res-raw目錄下獲取一張Bit

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

listview載入圖片過程圖片載入不一致原理。

//主介面佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com

一對一視訊交友原始碼關於圖片載入和部分自定義控制元件的原始碼

有這麼一部分原始碼,他們不如音視訊採集、播放部分的原始碼顯得那麼重要,但他們的存在使頁面看起來更美觀流暢,他們就是: 一、關於圖片載入的一段程式碼: 1、載入原圖,即沒有壓縮、裁剪、變換之前的圖,保持了原圖的大小、尺寸和解析度。 public static void displaySou

安卓專案實戰之Gif圖片載入的最佳實踐android-gif-drawable開源庫的使用

前言 在平時的專案開發中,我們或多或少會遇到載入gif圖片這樣的需求,但是Android的ImageView又無法直接載入Gif圖片,面對這樣的需求我們一般都會想到使用支援載入gif動圖的Glide第三方庫來進行實現,但是使用過程中發現Glide在載入大的gif

iOS開發:圖片載入@2x與@3x

myImage = [UIImage imageNamed:@"icon.png"]; 這種方法在一些圖片很少,或者圖片很小的程式裡是ok的。 但是,在大量載入圖片的程式裡,請千萬不要這樣做。 為什麼呢 ??????? 這種方法在application bundle的頂層資料夾尋找由供應的名字的圖象 。

Glide在RecyclerView部分圖片載入失敗的問題

在Android開發中,圖片載入是常見需求之一,而glide是目前最為主流的圖片載入框架了。但今天在使用時,遇到了一個問題:在recyclerview中部分圖片載入不出來,一直顯示的佔位圖.通過查詢資料,可以通過如下方法來解決問題: Glide.with(ac

iOS網路圖片的下載

1.    SDWebImage的簡單介紹   a)       SDWebImage支援非同步圖片下載+快取,提供了UIImageView+WebCacha的分類,方便使用。   b)       圖片檔案快取的時間最長是1周   c)        記憶體快取使

uitableviewcell圖片載入錯亂問題

當我們使用UITableView時,常常會自定義cell,當cell中包含網路圖片載入時,常會用到SDWebImage載入圖片,如果涉及到cell重用,就會引起圖片混亂,這時候有一個方法可以解決你的苦惱,那就是在cell中過載這個方法,coverImageView就是圖片檢視

iOS圖片拉伸的四種方式

1. UIImageView整體拉伸 方式一是通過設定容器UIImageView中圖片的顯示模式:UIImageView-contentMode,使容器內的圖片按照需要的拉伸方式在容器中顯示。 typedef NS_ENUM(NSInteger, UIV

iOS新增圖片選擇器的實現

//為imageview新增點選事件的方法,搜尋tap gesture 為圖片新增,並在右側選擇interfaceenable,後為左側的tap gesture拖入事件 //下方法為點選圖片後從相簿插

iOS開發gif圖片轉成NSData

前幾天做專案,需求是從系統的相簿中選者gif格式的圖片上傳到伺服器,之後介面顯示相關的gif圖片 顯示這裡應該不是問題 網上好多顯示處理gif圖片的Demo可以參考,從相簿中選擇到是困擾了我。 經過四處搜尋 找到了解決辦法 同時感謝提供這個方法的大神,表示特別的感謝

iOS開發】 iOS如何選擇圖片載入方式:imageNamed和imageWithContentsOfFile的區別

iOS記憶體稀缺,而圖片資源通常又是最佔記憶體的部分之一,因此,選擇如何載入圖片,對於優化應用記憶體佔用量,能起到立竿見影的效果。通常載入圖片的方式有兩種: 一、imageNamed 為什麼有兩種方法完成同樣的事情呢?imageNamed的優點在於可以快

iOS儲存圖片到相簿的兩種方式

方式一: UIImageWriteToSavedPhotosAlbum(self.imageV.image, self, @selector(image:didFinishSavingWithEr

iOS的懶載入

iOS開發中 我們經常使用懶載入 1.懶載入的好處,讓控制元件和物件在最需要載入的時候載入。這樣可以節省記憶體空間,因為我們移動的裝置資源還是比較寶貴的。所謂懶載入 就是推遲他的getter方法的執行。 比如。一個view的子控制元件 ,只有當這個view被顯示的時候才去載