tayloraswift/swift-png
π· **swift-png** πΈ
Requirements
The swift-png library requires Swift 5.10 or later.
| Platform | Status | | -------- | ------ | | π¬ Documentation | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Documentation.yml) | | π§ Linux | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π Darwin | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π Darwin (iOS) | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π Darwin (tvOS) | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π Darwin (visionOS) | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π Darwin (watchOS) | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) | | π€ Android | [[Status]](https://github.com/tayloraswift/swift-png/actions/workflows/Tests.yml) |
Getting started
To use swift-png in a project, add this descriptor to the dependencies list in your Package.swift file:
.package(url: "https://github.com/tayloraswift/swift-png", from: "4.5.0")The library is powered by a native Swift DEFLATE implementation, which can be used as a standalone module.
Basic usage
Decode an image:
import PNG
func decode(png path: String) throws {
guard
let image: PNG.Image = try .decompress(path: path) else {
// failed to access file from file system
}
let rgba: [PNG.RGBA<UInt8>] = image.unpack(as: PNG.RGBA<UInt8>.self),
size: (x:Int, y:Int) = image.size
// ...
}Encode an image:
func encode(png path: String, size: (x:Int, y:Int), pixels: [PNG.RGBA<UInt8>]) throws {
let image: PNG.Image = .init(
packing: pixels,
size: size,
layout: .init(format: .rgba8(palette: [], fill: nil))
)
try image.compress(path: path, level: 9)
}Features
- Powerful interfaces. swift-pngβs expressive, strongly-typed APIs make working with PNG images easy for beginners and advanced users alike. If your code compiles, youβre already most of the way there. Power users can take advantage of custom indexing, manual decoding workflows, and user-defined color targets.
- Superior compression. swift-png supports minimum cost path-based DEFLATE optimization, which is why it offers four additional compression levels beyond what libpng supports.
- Competitive performance. swift-png offers competitive performance compared to libpng. On appropriate CPU architectures, the swift-png encoder makes use of hardware-accelerated hash tables for even greater performance.
- Pure Swift, all the way down. swift-png is powered by its own, native Swift DEFLATE implementation. It depends only on other Foundation-less, pure-Swift libraries, and therefore does not need to link Foundation. This also means the core components of swift-png work on any platform that Swift itself works on, and that swift-pngβs performance improves as the Swift compiler matures.
- Batteries included. swift-png comes with built-in color targets with support for premultiplied alpha. Convolution?hash=O92V) and deconvolution?hash=2SQA0) helper functions make implementing custom color targets a breeze.
- First-class iPhone optimization support. swift-png requires no custom setup or third-party plugins to handle iPhone-optimized PNG images. iPhone-optimized images just work, on all platforms. Reproduce
pngcrushβs output with bit width-aware alpha premultiplication), for seamless integration anywhere in your application stack.
- Comprehensive metadata support. swift-png can parse and validate all public PNG chunks, which are accessible as strongly-typed metadata records.
- Modern error handling. swift-png has a fully stateless and Swift-native error-handling system.
See also
Package Metadata
Repository: tayloraswift/swift-png
Default branch: master
README: README.md