Skip to content

Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.

License

Notifications You must be signed in to change notification settings

andriitishchenko/YYImage

This branch is 81 commits behind ibireme/YYImage:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

11a23bf · Oct 26, 2015

History

9 Commits
Oct 24, 2015
Oct 24, 2015
Oct 24, 2015
Oct 24, 2015
Oct 24, 2015
Oct 24, 2015
Oct 26, 2015
Oct 24, 2015

Repository files navigation

YYImage

License MIT  Carthage compatible  [Cocoapods](http://cocoapods.org/?q= YYImage)  [Cocoapods](http://cocoapods.org/?q= YYImage)  Support

Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.

niconiconi~

Features

  • Display/encode/decode animated image with these types:
        WebP, APNG, GIF.
  • Display/encode/decode still image with these types:
        WebP, PNG, GIF, JPEG, JP2, TIFF, BMP, ICO, ICNS.
  • Baseline/progressive/interlaced image decode with these types:
        PNG, GIF, JPEG, BMP.
  • Display frame based image animation and sprite sheet animation.
  • Fully compatible with UIImage and UIImageView class.
  • Extendable protocol for custom image animation.
  • Dynamic memory buffer for lower memory usage.

Usage

###Display animated image

// File: [email protected]
UIImage *image = [YYImage imageNamed:@"ani.gif"];
UIImageView *imageView = [[YYAnimatedImageView alloc] initWithImage:image];
[self.view addSubView:imageView];

###Display frame animation

// Files: frame1.png, frame2.png, frame3.png
NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
NSArray *times = @[@0.1, @0.2, @0.1];
UIImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
UIImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
[self.view addSubView:imageView];

###Display sprite sheet animation

// 8 * 12 sprites in a single sheet image
UIImage *spriteSheet = [UIImage imageNamed:@"sprite-sheet"];
NSMutableArray *contentRects = [NSMutableArray new];
NSMutableArray *durations = [NSMutableArray new];
for (int j = 0; j < 12; j++) {
   for (int i = 0; i < 8; i++) {
       CGRect rect;
       rect.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
       rect.origin.x = img.size.width / 8 * i;
       rect.origin.y = img.size.height / 12 * j;
       [contentRects addObject:[NSValue valueWithCGRect:rect]];
       [durations addObject:@(1 / 60.0)];
   }
}
YYSpriteSheetImage *sprite;
sprite = [[YYSpriteSheetImage alloc] initWithSpriteSheetImage:img
                                                contentRects:contentRects
                                              frameDurations:durations
                                                   loopCount:0];
YYAnimatedImageView *imageView = [YYAnimatedImageView new];
imageView.size = CGSizeMake(img.size.width / 8, img.size.height / 12);
imageView.image = sprite;
[self.view addSubView:imageView];

###Animation control

YYAnimatedImageView *imageView = ...;
// pause:
[imageView stopAnimating];
// play:
[imageView startAnimating];
// set frame index:
imageView.currentAnimatedImageIndex = 12;
// get current status
image.currentIsPlayingAnimation;

###Image decoder

// Decode single frame:
NSData *data = [NSData dataWithContentOfFile:@"/tmp/image.webp"];
YYImageDecoder *decoder = [YYImageDecoder decoderWithData:data scale:2.0];
UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;

// Progressive:
NSMutableData *data = [NSMutableData new];
YYImageDecoder *decoder = [[YYImageDecoder alloc] initWithScale:2.0];
while(newDataArrived) {
   [data appendData:newData];
   [decoder updateData:data final:NO];
   if (decoder.frameCount > 0) {
       UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
       // progressive display...
   }
}
[decoder updateData:data final:YES];
UIImage image = [decoder frameAtIndex:0 decodeForDisplay:YES].image;
// final display...

###Image encoder

// Encode still image:
YYImageEncoder *jpegEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeJPEG];
jpegEncoder.quality = 0.9;
[jpegEncoder addImage:image duration:0];
NSData jpegData = [jpegEncoder encode];
 
// Encode animated image:
YYImageEncoder *webpEncoder = [[YYImageEncoder alloc] initWithType:YYImageTypeWebP];
webpEncoder.loopCount = 5;
[webpEncoder addImage:image0 duration:0.1];
[webpEncoder addImage:image1 duration:0.15];
[webpEncoder addImage:image2 duration:0.2];
NSData webpData = [webpEncoder encode];

Installation

Cocoapods

  1. Update cocoapods to the latest version.
  2. Add pod "YYImage" to your Podfile.
  3. Run pod install or pod update.
  4. Import <YYImage/YYImage.h>

Carthage

  1. Add github "ibireme/YYImage" to your Cartfile.
  2. Run carthage update --platform ios and add the framework to your project.
  3. Import <YYImage/YYImage.h>
  4. Notice: carthage framework doesn't include webp component, if you want to support webp, use cocoapods or install manually.

Manually

  1. Download all the files in the YYImage subdirectory.
  2. Add the source files to your Xcode project.
  3. Link with required frameworks:
    • UIKit.framework
    • CoreFoundation.framework
    • QuartzCore.framework
    • AssetsLibrary.framework
    • ImageIO.framework
    • Accelerate.framework
    • MobileCoreServices.framework
    • libz
  4. Add Vendor/WebP.framework(static library) to your Xcode project if you want to support webp.
  5. Import YYImage.h.

About

This library supports iOS 6.0 and later.

License

YYImage is provided under the MIT license. See LICENSE file for details.

About

Image framework for iOS to display/encode/decode animated WebP, APNG, GIF, and more.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Objective-C 99.7%
  • Ruby 0.3%