APNGKit is a high performance framework for loading and displaying APNG images in iOS and macOS.

Overview

APNGKit

APNGKit is a high performance framework for loading and displaying APNG images in iOS and macOS. It's built on top of a modified version of libpng with APNG support and written in Swift. High-level abstractions of Cocoa Touch is used for a delightful API. Since be that, you will feel at home and joy when using APNGKit to play with images in APNG format.

APNG, what and why?

The Animated Portable Network Graphics (APNG) is a file format extending the well-known PNG format. It allows for animated PNG files that work similarly to animated GIF files, while supporting 24-bit images and 8-bit transparency not available for GIFs. This means much better quality of animation. At the same time, the file size is comparable to or even less than, if created carefully, GIFs.

Talk is cheap; show me the image. You can click on the image to see how it looks like when animating.

APNGKit Demo

That's cool. APNG is much better! But wait...why haven't I heard about APNG before? It is not a popular format, so why should I use it in my next great iOS/macOS app?

Good question! APNG is an excellent extension for regular PNG, and it is also very simple to use and not conflicting with current PNG standard (It consists a standard PNG header, so if your platform does not support APNG, it will be recognized as a normal PNG with its first frame being displayed as a static image). But unfortunately, it is a rebel format so that it is not accepted by the PNG group. However, it is accepted by many vendors and is even mentioned in W3C Standards. There is another format called MNG (Multiple-image Network Graphics), which is created by the same team as PNG. It is a comprehensive format, but very very very (重要的事要说三遍) complex. It is so complex that despite being a "standard", it was almost universally rejected. There is only one "popular" browser called Konqueror(at least I have used it before when I was in high school) that supports MNG, which is really a sad but reasonable story.

Even though APNG is not accepted currently, we continue to see the widespread implementation of it. Apple recently supported APNG in both desktop and mobile Safari. Microsoft Edge and Chrome are also considering adding APNG support since it is already officially added in WebKit core.

APNG is such a nice format to bring users much better experience of animating images. The more APNG is used, the more recognition and support it will get. Not only in the browsers world, but also in the apps we always love. That's why I created this framework.

Installation

Requirement

iOS 8.0+ / macOS 10.10+

Although it is written in Swift, the compatibility with Objective-C is also considered.

The latest versions (1.x) supports from Xcode 9 (Swift 3.2 or Swift 4). If you are still using Xcode 8, try version 0.6.4 instead.

CocoaPods

CocoaPods is a dependency manager for Cocoa projects.

CocoaPods 0.36 adds supports for Swift and embedded frameworks. You can install it with the following command:

$ gem install cocoapods

To integrate APNGKit into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

target 'your_app' do
  pod 'APNGKit', '~> 1.0'
end

Then, run the following command:

$ pod install

You should open the {Project}.xcworkspace instead of the {Project}.xcodeproj after you installed anything from CocoaPods.

For more information about how to use CocoaPods, I suggest this tutorial.

Carthage

Carthage is a decentralized dependency manager for Cocoa application. To install the carthage tool, you can use Homebrew.

$ brew update
$ brew install carthage

To integrate APNGKit into your Xcode project using Carthage, specify it in your Cartfile:

1.0 ">
github "onevcat/APNGKit" ~> 1.0

Then, run the following command to build the APNGKit framework:

$ carthage update

At last, you need to set up your Xcode project manually to add the APNGKit framework.

On your application targets’ “General” settings tab, in the “Linked Frameworks and Libraries” section, drag and drop each framework you want to use from the Carthage/Build folder on disk.

On your application targets’ “Build Phases” settings tab, click the “+” icon and choose “New Run Script Phase”. Create a Run Script with the following content:

/usr/local/bin/carthage copy-frameworks

and add the paths to the frameworks you want to use under “Input Files”:

$(SRCROOT)/Carthage/Build/iOS/APNGKit.framework

For more information about how to use Carthage, please see its project page.

Manually

It is not recommended to install the framework manually, but it could let you use APNGKit for a deploy target as low as 7.0. You can just download the latest package from the release page and drag all things under "APNGKit" folder into your project. Then you need to create a bridging header file and add this into it:

#import "png.h"

You can find more information about how to add a bridging header here.

Then you need to add "libz.tbd" in the "Link Binary With Libraries" section in Build Phases. Now APNGKit should compile without issue with your project.

If you are using Swift, fine, just skip the content below to "Usage". If you want to use APNGKit in Objective-C code, you have to check these settings of your project as well:

  • Product Module Name: Should be your app target's name
  • Defines Module: YES
  • Embedded Content Contains Swift: YES
  • Install Objective-C Compatibility Header: YES

At last, import the umbrella header file in the .m files you want to use APNGKit:

#import "{YOUR_APP_MODULE_NAME}-Swift.h"

Now you can use APNGKit with Objective-C. Ummm...a bit complicated, isn't it? Life is short, let's Swift!

For more information about working with Swift mixing Objective-C/C or vice versa, you could find some useful information from Apple's documentation on it.

Usage

You can find the full API documentation at CocoaDocs.

Basic

Import APNGKit into your source files in which you want to use the framework.

import APNGKit

APNGKit is using the similar APIs as UIImage and UIImageView. Generally speaking, you can just follow the way you do with images in Cocoa Touch to use this framework. The only difference is the name is changed to APNGImage and APNGImageView.

Load an APNG Image

// Load an APNG image from file in main bundle
var image = APNGImage(named: "your_image")

// Or
// Load an APNG image from file at specified path
var path = NSBundle.mainBundle().pathForResource("your_image", ofType: "apng")
if let path = path {
  image = APNGImage(contentsOfFile: path)  
}

// Or
// Load an APNG image from data
let data: NSData = ... // From disk or network or anywhere else.
image = APNGImage(data: data)

APNGKit will try to load all data in the image by one time, so you could play the animation smoothly later. However, if you are trying to load a large APNG file, you may want to keep the memory footprint as small as possible. For this case, you could use a progressive way to load the image. It will only load the frame needed to be display currently. This would save a lot of memory, but take more performance as a trade-off. To enable the progressive way, just pass in an option to the initializer:

let image = APNGImage(data: data, progressive: true)

Display an APNG Image

When you have an APNGImage object, you can use it to initialize an image view and display it on screen with APNGImageView, which is a subclass of UIView:

let image: APNGImage = ... // You already have an APNG image object.

let imageView = APNGImageView(image: image)
view.addSubview(imageView)

And play the animation:

imageView.startAnimating()

If you are an Interface Builder lover, drag a UIView (Please note, not a UIImageView) to the canvas, and modify its class to APNGImageView. Then, you can drag an IBOutlet and play with it as usual.

Caches

APNGKit is using memory cache to improve performance when loading an image. If you use initWithName: or initWithContentsOfFile:saveToCache: with true, the APNGKit will cache the result for later use. Normally, you have no need to take care of the caches. APNGKit will manage it and release the caches when a memory warning is received or your app switched to background.

If you need a huge chunk of memory to do an operation, you can call this to force APNGKit to clear the memory cache:

APNGCache.defaultCache.clearMemoryCache()

It will be useful sometimes since there is a chance that your app will crash before a memory warning could be received when you alloc a huge amount of memory. But it should be rare, so if you are not sure about it, just leave APNGKit to manage the cache itself.

PNG Compression

Xcode will compress all PNG files in your app bundle when you build the project. Since APNG is an extension format of PNG, Xcode will think there are redundancy data in that file and compress it into a single static image. This is not what you want. You can disable the PNG compression by setting "COMPRESS_PNG_FILES" to NO in the build settings of your app target. However, it will also prevent Xcode to optimize your other regular PNGs.

A better approach would be renaming your APNG files with an extension besides of "png". If you do so, Xcode will stop recognizing your APNG files as PNG format, and will not apply compression on them. A suggested extension is "apng", which will be detected and handled by APNGKit seamlessly.

TODO

Currently APNGKit can only load and display APNG files or data. There is a plan to extend this framework to export and write APNG files from separated PNG files as frames.

And maybe some callbacks of APNG animation playing or even more controlling of playing will be added later as well. IBDesignable support is also in plan.

Acknowledgement

APNGKit is built on top of a modified version of libpng. The original libpng could be found here. I patched it for APNG supporting based on code in this project.

The demo images in README file is stolen from ICS Lab, you can find the original post here.

The logo of this APNGKit is designed by Rain (yuchen liu), who is a brilliant designer as well as a skillful coder.

Reference

If you are interested in APNG, you can know more about it from the links below (some of them are written in Chinese).

APNGKit can only load and display APNG image now. The creating feature will be developed later. If you need to create APNG file now, I suggest using iSparta or apngasm instead for now.

License

APNGKit is released under the MIT license. See LICENSE for details.

Comments
  • APNGImageView is not recognized by Xcode 7 in storyboard

    APNGImageView is not recognized by Xcode 7 in storyboard

    Autocomplete does not work and Xcode doesn't allow me to use it at all because of that.

    2015-10-21 11 26 18

    Although I can use APNGKit's functions in code.

    Am I doing something wrong? Or is there a bug in your code?

    opened by yurijmi 15
  • Project Bitcode issue

    Project Bitcode issue

    In out project, we setting the OTHER_CFLAGS to -fembed-bitcode but it show error:

    Showing All Errors Only
    ld: bitcode bundle could not be generated because '.../Build/Products/Debug-iphoneos/APNGKit/APNGKit.framework/APNGKit' was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build for architecture arm64
    

    Is any setting missing or APNGKit didn't support bitcode?

    opened by marcuswu0814 11
  • Issue in compiling with xcode 8 - for legacy support - swift 2.3

    Issue in compiling with xcode 8 - for legacy support - swift 2.3

    Hi!

    I am trying to use the library. I get error for below: /APNGKit/Frame.swift:75:73: Nil is not compatible with expected argument type 'CGDataProviderReleaseDataCallback' (aka '@convention(c) (UnsafeMutablePointer<()>, UnsafePointer<()>, Int) -> ()')

    Tried this for most versions of library - 0.1.0 to 0.1.4.

    Please suggest way to deal with this. My project is in Swift 2.3, so need library compiled with 2.3 to be used.

    Thanks!

    opened by harit 10
  • mouse ear gets stuck

    mouse ear gets stuck

    Hi team. I have an issue could you help?

    I used APNGKit v2.0.2, it works for me with almost apng images, but I encountered an issue with mouse

    https://user-images.githubusercontent.com/2205362/144172712-94f36430-1c48-42b1-9953-37d784123544.mov

    I tried view this image on the Safari browser (Mac OS) with url: file:///Users/../Downloads/mouse.png - no stuck ear.

    opened by duyenlv 7
  • Prevent crash in libapng

    Prevent crash in libapng

    This is a discussion about an issue I had in APNGKit. I think it would be easier to have a discussion based on the PR.

    setjmp, longjmp

    It seems this code is trying to save the program from a longjmp inside libapng: https://github.com/onevcat/APNGKit/blob/704d1b58cf9ccc284d0c150e76bbcf2b5745c575/APNGKit/Disassembler.swift#L247

    However, I don't think it works because png_jmpbuf(pngPointer) just returns the jmpbuf. A setjmp function call should be used, but it is no longer available in Swift for safety.

    The Actual Issue

    I'm having a crash in my app. I created a demo: https://github.com/axl411/APNGKitCrash

    The crash happens at this line: https://github.com/onevcat/APNGKit/blob/704d1b58cf9ccc284d0c150e76bbcf2b5745c575/APNGKit/Disassembler.swift#L168

    Inside libapng, the error happens at: https://github.com/onevcat/APNGKit/blob/704d1b58cf9ccc284d0c150e76bbcf2b5745c575/APNGKit/libpng-apng/pngread.c#L333

    A longjmp is called at last in libapng, but since no setjmp is called earlier, the program crashes.

    Fix

    To fix this we need to call setjmp earlier on the stack to escape from the error. I tried but it seems in Swift this is not possible. So the fix is to move the processing code that could call longjmp inside libapng to the ObjC env, and let ObjC handles the call to setjmp and the code for exiting.

    In my PR I just move the call to png_read_frame_head to ObjC, and handle the setjmp call there.

    However, png_read_frame_head is not the only function that could call longjmp, we should guard all calls to libapng with setjmp, in every method. So eventually, it seems the whole parsing code should be written in ObjC, guarded by setjmp, and only the interface code can be in Swift. Here's an example: https://github.com/line/apng-drawable/blob/7097a85fe94c18623fd7df6d833719289e4a105b/apng-drawable/src/main/cpp/apng-drawbale/ApngDecoder.cpp (pls search "setjmp")

    opened by axl411 6
  • optimize cpu load to build next frame by first progressive decoding

    optimize cpu load to build next frame by first progressive decoding

    There is problem on APNGImage.next(currentIndex:) that consume cpu load almost 70% of total 24%.

    Test environment: iPhone 6s, iOS 10.1.1 Demo app: APNGDemo-iOS APNG file: spinfox.apng

    I've fixed it to build next frame by first progressive decoding.

    Let me know if it has any problems. Thank you.

    Before

    cpu profile

    After

    final
    opened by netmaid 6
  • support macOS

    support macOS

    changes

    • [x] add a target named APNGKit OSX to support macOS 10.10 or later.
    • [x] the framework name is APNGKit, same as iOS.
    • [x] add macOS test target APNGKitTests OSX, using existing iOS test cases.
    • [x] when write a demo to test, it works well.

    to do

    • [ ] for macOS, if set repeatCount, mouse over event to support replay.
    • [ ] for macOS, auto startAnimating when APNGImageView becomes visible, auto stopAnimating when it becomes invisible.

    note

    • could you change the iOS target name to APNGKit iOS, and keep the framework name as APNGKit
    • could you change the directory structure in order to add a Mac App demo.
    opened by tyljohnny 6
  • Carthage in Objective-C context

    Carthage in Objective-C context

    Hey,

    I'm trying to use APNGKit with Carthage in Objective-C context. I can't use Swift because its an Unity project. Is this combination possible? I imported <APNGKit/APNGKit-Swift.h> but the header file does only expose the default init and initWithDecoder methods. I tried [[APNGImage alloc] contentsOfFile:@""] wich throws No visible @interface for 'APNGImage' declares the selector 'contentsOfFile:'

    opened by dionysiusmarquis 5
  • Repeatedly push an view controller whose view owned a apng animation view and pop it, app will crash.

    Repeatedly push an view controller whose view owned a apng animation view and pop it, app will crash.

    This is the occasional problem. And we detected it by our apm system. And finally positioned to the APNGKit. I test the APNGKit's demo, it also has the same problem.

    This is the error symbol stack log of APNGKitDemo proj.

    Hardware Model:      iPhone7,2
    Process:             APNGDemo-iOS [3710]
    Path:                /private/var/containers/Bundle/Application/42CDB407-533D-4EA7-8F5D-77F199CBAC8B/APNGDemo-iOS.app/APNGDemo-iOS
    Identifier:          com.onevcat.APNGDemo-iOS
    Version:             1 (1.0)
    Code Type:           ARM-64 (Native)
    Role:                Foreground
    Parent Process:      launchd [1]
    Coalition:           com.onevcat.APNGDemo-iOS [3835]
    
    
    Date/Time:           2017-11-07 10:28:59.6368 +0800
    Launch Time:         2017-11-07 10:27:52.6125 +0800
    OS Version:          iPhone OS 10.3.2 (14F89)
    Report Version:      104
    
    Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
    Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000109e38000
    Termination Signal: Segmentation fault: 11
    Termination Reason: Namespace SIGNAL, Code 0xb
    Terminating Process: exc handler [0]
    Triggered by Thread:  0
    
    Filtered syslog:
    None found
    
    Thread 0 name:  Dispatch queue: com.apple.main-thread
    Thread 0 Crashed:
    0   libsystem_platform.dylib      	0x000000018bd20e10 _platform_memmove + 176
    1   CoreGraphics                  	0x000000018e0702c0 decode_data + 13144
    2   CoreGraphics                  	0x000000018e239720 img_decode_read + 2024
    3   CoreGraphics                  	0x000000018e23d490 img_alphamerge_read + 548
    4   CoreGraphics                  	0x000000018e2408fc img_data_lock + 6124
    5   CoreGraphics                  	0x000000018e23f0b8 CGSImageDataLock + 176
    6   CoreGraphics                  	0x000000018e05f1c0 ripc_AcquireImage + 756
    7   CoreGraphics                  	0x000000018e2539a4 ripc_DrawImage + 656
    8   CoreGraphics                  	0x000000018e243b50 CGContextDrawImageWithOptions + 632
    9   QuartzCore                    	0x000000018fe87a8c CA::Render::(anonymous namespace)::create_image_by_rendering+ 105100 (CGImage*, CGColorSpace*, unsigned int, double) + 1068
    10  QuartzCore                    	0x000000018fe88960 CA::Render::(anonymous namespace)::create_image_from_rgb_image+ 108896 (CGImage*, CGColorSpace*, unsigned int, double) + 660
    11  QuartzCore                    	0x000000018fe874b0 CA::Render::create_image+ 103600 (CGImage*, CGColorSpace*, unsigned int, double) + 876
    12  QuartzCore                    	0x000000018fe89238 CA::Render::copy_image+ 111160 (CGImage*, CGColorSpace*, unsigned int, double, double) + 472
    13  QuartzCore                    	0x000000018ff87434 -[CALayer+ 1152052 (CALayerPrivate) _copyRenderLayer:layerFlags:commitFlags:] + 480
    14  QuartzCore                    	0x000000018fef4a74 CA::Context::commit_layer+ 551540 (CA::Layer*, unsigned int, unsigned int, void*) + 108
    15  QuartzCore                    	0x000000018ff7a3a8 CA::Layer::commit_if_needed(CA::Transaction*, void (*)+ 1098664 (CA::Layer*, unsigned int, unsigned int, void*), void*) + 388
    16  QuartzCore                    	0x000000018feb39ac x_hash_table_foreach + 72
    17  QuartzCore                    	0x000000018ff1d4c0 CA::Transaction::foreach_root(void (*)+ 718016 (CA::Layer*, void*), void*) + 40
    18  QuartzCore                    	0x000000018fef5778 CA::Context::commit_transaction+ 554872 (CA::Transaction*) + 1320
    19  QuartzCore                    	0x000000018ff1c3ac CA::Transaction::commit+ 713644 () + 504
    20  QuartzCore                    	0x000000018ff1ce78 CA::Transaction::observer_callback+ 716408 (__CFRunLoopObserver*, unsigned long, void*) + 120
    21  CoreFoundation                	0x000000018cc149a8 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
    22  CoreFoundation                	0x000000018cc12630 __CFRunLoopDoObservers + 372
    23  CoreFoundation                	0x000000018cc12a7c __CFRunLoopRun + 956
    24  CoreFoundation                	0x000000018cb42da4 CFRunLoopRunSpecific + 424
    25  GraphicsServices              	0x000000018e5ac074 GSEventRunModal + 100
    26  UIKit                         	0x0000000192dfd058 UIApplicationMain + 208
    27  APNGDemo-iOS                  	0x0000000100097cfc 0x100090000 + 31996
    28  libdyld.dylib                 	0x000000018bb5159c start + 4
    
    opened by Desgard 5
  • [bug] The repeat count info is not working.

    [bug] The repeat count info is not working.

    The repeat count info is not working.

    The repleatCount in png metadata means that repeat animation after end of the last play. So #0 means that 1 time animation from first frame. #1 means that 2 times repeat. #2 means that 3 time repeat.

    REF. https://wiki.mozilla.org/APNG_Specification num_plays indicates the number of times that this animation should play; if it is 0, the animation should play indefinitely. If nonzero, the animation should come to rest on the final frame at the end of the last play.

    opened by cabbage98 4
  • Missing PLTE before IDAT

    Missing PLTE before IDAT

    I have converted some gifs to apng files. But I am getting this error when I'm trying to use them:

    imagePNG_error_break:445: *** ERROR: imagePNG_error_break handle_error:269: IDAT: Missing PLTE before IDAT

    What does it mean? How can I get these files to work?

    opened by alexionut 3
  • How to tint a APNG Image?

    How to tint a APNG Image?

    I would like to tint a Image like

    let imageView = UIImageView()
    imageView.image = UIImage(named: "custom-icon")?.withRenderingMode(.alwaysTemplate)
    imageView.tintColor = .red
    

    How can I do that with APNG?

    let imageView = APNGImageView()
    imageView.image = APNGImage(named: "custom-apng-icon", progressive: true)
    imageView.tintColor = .red
    

    ..but it does not work

    opened by StefaniOSApps 1
Releases(2.2.1)
Owner
Wei Wang
Developer, creator, proud father.
Wei Wang
Advanced framework for loading, caching, processing, displaying and preheating images.

Advanced framework for loading, caching, processing, displaying and preheating images. This framework is no longer maintained. Programming in Swift? C

Alexander Grebenyuk 1.2k Nov 17, 2022
A high-performance image library for downloading, caching, and processing images in Swift.

Features Asynchronous image downloader with priority queuing Advanced memory and database caching using YapDatabase (SQLite) Guarantee of only one ima

Yap Studios 72 Sep 19, 2022
ImageView - Component for loading and displaying different images aka SVG/PNG/JPG/JPEG

ImageView Component that loads and displays images(.svg/.png/.jpg/.jpeg) form as

Sergei 1 Mar 23, 2022
An extremely high-performance, lightweight, and energy-efficient pure Swift async web image loader with memory and disk caching for iOS and  Watch.

KFSwiftImageLoader KFSwiftImageLoader is an extremely high-performance, lightweight, and energy-efficient pure Swift async web image loader with memor

Kiavash Faisali 343 Oct 29, 2022
High-performance animated GIF support for iOS in Swift

Gifu adds protocol-based, performance-aware animated GIF support to UIKit. (It's also a prefecture in Japan). Install Swift Package Manager Add the fo

Reda Lemeden 2.6k Jun 21, 2021
High performance GIF engine

SwiftyGif High performance & easy to use Gif engine Features UIImage and UIImageView extension based Remote GIFs with customizable loader Great CPU/Me

Alexis Creuzot 1.7k Nov 17, 2022
SwiftUI view that download and display image from URL and displaying Activity Indicator while loading .

ViewWithActivityIndicator ViewWithActivityIndicator is a SwiftUI view that download and display image from URL and displaying Activity Indicator while

Ali Adam 28 Feb 3, 2022
iOS library for quickly displaying images while scrolling

Fast Image Cache is an efficient, persistent, and—above all—fast way to store and retrieve images in your iOS application. Part of any good iOS applic

Path Mobile Inc Pte. Ltd. 8.2k Nov 23, 2022
A Swift/SwiftUI utility for caching and displaying images in SwiftUI Views

A Swift/SwiftUI utility for caching and displaying images asynchronously. Built with Swift 5.5 and works with async/await.

王雪铮 Xuezheng Wang 1 May 5, 2022
A UIActivityViewController to share images while displaying them as a nice preview.

PSActivityImageViewController Overview This view controller allows you to share an image the same way as a normal UIActivityViewController would, with

Peter Salz 11 Oct 19, 2022
High Quality Image ScrollView using cropped tiled images.

THTiledImageView Feature ?? THTiledImageView fully support UIScrollView. You can subclass it and use it. ?? Support Async Image Downloading & Caching.

null 28 Oct 28, 2022
AsyncImageExample An example project for AsyncImage. Loading images in SwiftUI article.

AsyncImageExample An example project for AsyncImage. Loading images in SwiftUI article. Note: The project works in Xcode 13.0 beta (13A5154h).

Artem Novichkov 4 Dec 31, 2021
A simple macOS app to read code from images, written purely in Swift using Vision Framework.

CodeReader A simple macOS app to read code from images, written purely in Swift using Vision Framework. Usage Drag an image Click the convert button R

Md Ibrahim Hassan 44 Nov 20, 2022
An implementation of High Pass Skin Smoothing using Apple's Core Image Framework

YUCIHighPassSkinSmoothing An implementation of High Pass Skin Smoothing using CoreImage.framework Available on both OS X and iOS. Ports A MetalPetal b

Yu Ao 1.2k Nov 15, 2022
Twitter Image Pipeline is a robust and performant image loading and caching framework for iOS clients

Twitter Image Pipeline (a.k.a. TIP) Background The Twitter Image Pipeline is a streamlined framework for fetching and storing images in an application

Twitter 1.8k Nov 23, 2022
A simple mesh viewer for MacOS based on Swift and Metal and using Assimp for loading meshes

Metal Mesh Viewer A simple triangle mesh viewer for MacOS This application is a simple (triangle) mesh viewer that should be capable of rendering even

J. Andreas Bærentzen 0 Dec 13, 2021
SwiftUI Image loading and Animation framework powered by SDWebImage

SDWebImageSwiftUI What's for SDWebImageSwiftUI is a SwiftUI image loading framework, which based on SDWebImage. It brings all your favorite features f

null 1.5k Nov 23, 2022
Asynchronous image loading framework.

YYWebImage YYWebImage is an asynchronous image loading framework (a component of YYKit). It was created as an improved replacement for SDWebImage, PIN

null 3.5k Nov 17, 2022
EbImagesSwiftUI - SDWebImageSwiftUI - a SwiftUI image loading framework, which based on SDWebImage

SDWebImageSwiftUI What's for SDWebImageSwiftUI is a SwiftUI image loading framew

An Tran 1 Jan 6, 2022