https://github.com/tayloraswift/swift-jpeg
  
  
    decode, inspect, edit, and encode jpeg images in pure swift 
    https://github.com/tayloraswift/swift-jpeg
  
codec jpeg multimedia-codecs pure-swift swift
        Last synced: 7 months ago 
        JSON representation
    
decode, inspect, edit, and encode jpeg images in pure swift
- Host: GitHub
- URL: https://github.com/tayloraswift/swift-jpeg
- Owner: tayloraswift
- License: apache-2.0
- Created: 2017-11-06T07:38:33.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2024-11-21T16:02:46.000Z (11 months ago)
- Last Synced: 2024-11-29T21:28:32.805Z (11 months ago)
- Topics: codec, jpeg, multimedia-codecs, pure-swift, swift
- Language: Swift
- Homepage: https://swiftinit.org/docs/swift-jpeg/jpeg
- Size: 61.6 MB
- Stars: 150
- Watchers: 8
- Forks: 18
- Open Issues: 6
- 
            Metadata Files:
            - Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
 
Awesome Lists containing this project
README
          
***`jpeg`***
[](https://github.com/tayloraswift/swift-jpeg/actions/workflows/Tests.yml)
[](https://github.com/tayloraswift/swift-jpeg/actions/workflows/Documentation.yml)
Swift *JPEG* is a cross-platform pure Swift framework for decoding, inspecting, editing, and encoding JPEG images. The core framework has no external dependencies, including *Foundation*, and should compile and provide consistent behavior on *all* Swift platforms. The framework supports additional features, such as file system support, on Linux and MacOS.
Swift *JPEG* is available under the [Apache 2.0 License](LICENSE). The [example programs](Snippets/) are public domain and can be adapted freely.
[documentation](https://swiftinit.org/docs/swift-jpeg/jpeg) ยท
[license](LICENSE)
## Requirements
The swift-jpeg library requires Swift 5.10 or later.
| Platform | Status |
| -------- | ------ |
| ๐ง Linux | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/Tests.yml) |
| ๐ Darwin | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/Tests.yml) |
| ๐ Darwin (iOS) | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/iOS.yml) |
| ๐ Darwin (tvOS) | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/tvOS.yml) |
| ๐ Darwin (visionOS) | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/visionOS.yml) |
| ๐ Darwin (watchOS) | [](https://github.com/tayloraswift/swift-jpeg/actions/workflows/watchOS.yml) |
[Check deployment minimums](https://swiftinit.org/docs/swift-jpeg#ss:platform-requirements)
## [tutorials and example programs](examples/)
* [basic decoding](examples#basic-decoding)
* [basic encoding](examples#basic-encoding)
* [advanced decoding](examples#advanced-decoding)
* [advanced encoding](examples#advanced-encoding)
* [using in-memory images](examples#using-in-memory-images)
* [online decoding](examples#online-decoding)
* [requantizing images](examples#requantizing-images)
* [lossless rotations](examples#lossless-rotations)
* [custom color formats](examples#custom-color-formats)
## [api reference](https://swiftinit.org/docs/swift-jpeg/jpeg/)
* [`JPEG.JPEG`](https://swiftinit.org/docs/swift-jpeg/jpeg/jpeg)
* [`JPEG.General`](https://swiftinit.org/docs/swift-jpeg/jpeg/general)
* [`JPEG.System`](https://swiftinit.org/docs/swift-jpeg/jpegsystem/system)
## getting started
To Swift *JPEG* in a project, add this descriptor to the `dependencies` list in your `Package.swift`:
```swift
.package(url: "https://github.com/tayloraswift/swift-jpeg", from: "2.0.0")
```
## basic usage
Decode an image:
```swift
import JPEG
func decode(jpeg path:String) throws
{
    guard let image:JPEG.Data.Rectangular = try .decompress(path: path)
    else
    {
        // failed to access file from file system
    }
    let rgb:[JPEG.RGB]      = image.unpack(as: JPEG.RGB.self),
        size:(x:Int, y:Int) = image.size
    // ...
}
```
Encode an image:
```swift
import JPEG
func encode(jpeg path:String, size:(x:Int, y:Int), pixels:[JPEG.RGB],
    compression:Double) // 0.0 = highest quality
    throws
{
    let layout:JPEG.Layout = .init(
        format:     .ycc8,
        process:    .baseline,
        components:
        [
            1: (factor: (2, 2), qi: 0), // Y
            2: (factor: (1, 1), qi: 1), // Cb
            3: (factor: (1, 1), qi: 1), // Cr
        ],
        scans:
        [
            .sequential((1, \.0, \.0), (2, \.1, \.1), (3, \.1, \.1)),
        ])
    let jfif:JPEG.JFIF = .init(version: .v1_2, density: (72, 72, .inches))
    let image:JPEG.Data.Rectangular =
        .pack(size: size, layout: layout, metadata: [.jfif(jfif)], pixels: rgb)
    try image.compress(path: path, quanta:
    [
        0: JPEG.CompressionLevel.luminance(  compression).quanta,
        1: JPEG.CompressionLevel.chrominance(compression).quanta
    ])
}
```