Skip to content

Commit 8dc3d25

Browse files
committed
Add supportsHeicLoading
1 parent 2b236ae commit 8dc3d25

24 files changed

Lines changed: 106 additions & 44 deletions

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,15 @@ const path = await image.saveToTemporaryFileAsync('jpg', 50) // 50% compre
167167
const compressed = await image.toEncodedImageData('jpg', 50) // 50% compression
168168
```
169169

170+
#### HEIC/HEIF
171+
172+
NitroImage supports `HEIC`/`HEIF` format if the host OS natively supports it.
173+
174+
| | iOS | Android |
175+
|--------------|----------------|----------------|
176+
| Loading HEIC || ✅ (>= SDK 28) |
177+
| Writing HEIC | ✅ (>= iOS 17) ||
178+
170179
### Hooks
171180

172181
#### The `useImage()` hook

packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageFactory.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import android.graphics.Bitmap
55
import android.graphics.BitmapFactory
66
import androidx.annotation.Keep
77
import com.facebook.common.internal.DoNotStrip
8-
import com.facebook.react.bridge.ReactApplicationContext
98
import com.madebyevan.thumbhash.ThumbHash
109
import com.margelo.nitro.NitroModules
1110
import com.margelo.nitro.core.ArrayBuffer

packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageUtils.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.margelo.nitro.image
22

3+
import android.os.Build
34
import androidx.annotation.Keep
45
import com.facebook.common.internal.DoNotStrip
56
import com.margelo.nitro.core.ArrayBuffer
@@ -10,6 +11,19 @@ import kotlin.io.encoding.ExperimentalEncodingApi
1011
@DoNotStrip
1112
@Keep
1213
class HybridImageUtils: HybridImageUtilsSpec() {
14+
override val supportsHeicLoading: Boolean
15+
get() {
16+
// Since Android 10, HEIF/HEIC is standard.
17+
// https://source.android.com/docs/core/camera/heif
18+
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
19+
}
20+
override val supportsHeicWriting: Boolean
21+
get() {
22+
// Android does not support saving HEIF data yet
23+
return false
24+
}
25+
26+
1327
@OptIn(ExperimentalEncodingApi::class)
1428
override fun thumbHashToBase64String(thumbhash: ArrayBuffer): String {
1529
val buffer = thumbhash.toByteArray()

packages/react-native-nitro-image/ios/HybridImageFactory.swift

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,6 @@ import NitroModules
1010
import UniformTypeIdentifiers
1111

1212
class HybridImageFactory: HybridImageFactorySpec {
13-
var supportsHEIC: Bool {
14-
if #unavailable(iOS 17.0) {
15-
// HEIC .heicData() is only available on iOS 17
16-
return false
17-
}
18-
// Check if the type is supported by the OS
19-
let types = CGImageDestinationCopyTypeIdentifiers() as! [String]
20-
return types.contains(UTType.heic.identifier)
21-
}
22-
2313
/**
2414
* Load Image from file path
2515
*/

packages/react-native-nitro-image/ios/HybridImageUtils.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,23 @@
77

88
import Foundation
99
import NitroModules
10+
import UniformTypeIdentifiers
1011

1112
class HybridImageUtils: HybridImageUtilsSpec {
13+
var supportsHeicLoading: Bool {
14+
// Check if the type is supported by the OS
15+
let types = CGImageDestinationCopyTypeIdentifiers() as! [String]
16+
return types.contains(UTType.heic.identifier)
17+
}
18+
var supportsHeicWriting: Bool {
19+
// HEIC .heicData() is only available on iOS 17
20+
if #available(iOS 17.0, *) {
21+
return true
22+
} else {
23+
return false
24+
}
25+
}
26+
1227
func thumbHashToBase64String(thumbhash: ArrayBuffer) throws -> String {
1328
let data = thumbhash.toData(copyIfNeeded: false)
1429
return data.base64EncodedString()

packages/react-native-nitro-image/ios/UIImage+getData.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ extension UIImage {
2323
return data
2424
case .heic:
2525
guard #available(iOS 17.0, *) else {
26-
throw RuntimeError.error(withMessage: "HEIC is only available on iOS 17.0 or higher! " +
27-
"Check ImageFactory.supportsHEIC before calling this method.")
26+
throw RuntimeError.error(withMessage: "HEIC writing is only available on iOS 17.0 or higher! " +
27+
"Check ImageUtils.supportsHeicWriting before calling this method.")
2828
}
2929
guard let data = self.heicData() else {
3030
throw RuntimeError.error(withMessage: "Failed to convert \(size.width)x\(size.height) Image to HEIC!")

packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp

Lines changed: 1 addition & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.cpp

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)