From 400abd33e45771a3ede7b9bf0d8967966981eed5 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Thu, 15 Apr 2021 05:09:31 +0800 Subject: [PATCH] HEIC support --- lib/entity/file_util.dart | 1 + lib/mobile/metadata_loader.dart | 33 ++++++++--------------------- lib/platform/metadata_loader.dart | 35 +++++++++++++++++++++++++++++++ lib/web/metadata_loader.dart | 16 ++++---------- pubspec.lock | 6 +++--- pubspec.yaml | 2 +- 6 files changed, 53 insertions(+), 40 deletions(-) diff --git a/lib/entity/file_util.dart b/lib/entity/file_util.dart index f76db2bc..f4829555 100644 --- a/lib/entity/file_util.dart +++ b/lib/entity/file_util.dart @@ -7,4 +7,5 @@ const _supportedFormatMimes = [ "image/jpeg", "image/png", "image/webp", + "image/heic", ]; diff --git a/lib/mobile/metadata_loader.dart b/lib/mobile/metadata_loader.dart index 597cbae9..85193abf 100644 --- a/lib/mobile/metadata_loader.dart +++ b/lib/mobile/metadata_loader.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:exifdart/exifdart_io.dart'; import 'package:exifdart/exifdart_memory.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; -import 'package:image_size_getter/image_size_getter.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/api/api.dart'; @@ -42,17 +41,10 @@ class MetadataLoader implements itf.MetadataLoader { response: response, message: "Failed communicating with server: ${response.statusCode}"); } - final resolution = - await AsyncImageSizeGetter.getSize(AsyncMemoryInput(response.body)); - final exif = await readExifFromBytes(response.body); - return { - if (exif != null) "exif": exif, - if (resolution.width > 0 && resolution.height > 0) - "resolution": { - "width": resolution.width, - "height": resolution.height, - }, - }; + return itf.MetadataLoader.loadMetadata( + exifdartReaderBuilder: () => MemoryBlobReader(response.body), + imageSizeGetterInputBuilder: () => AsyncMemoryInput(response.body), + ); } @override @@ -72,18 +64,11 @@ class MetadataLoader implements itf.MetadataLoader { _getFileTask.cancel(); } - Future> _onGetFile(FileInfo f) async { - final resolution = - await AsyncImageSizeGetter.getSize(AsyncFileInput(f.file)); - final exif = await readExifFromFile(f.file); - return { - if (exif != null) "exif": exif, - if (resolution.width > 0 && resolution.height > 0) - "resolution": { - "width": resolution.width, - "height": resolution.height, - }, - }; + Future> _onGetFile(FileInfo f) { + return itf.MetadataLoader.loadMetadata( + exifdartReaderBuilder: () => FileReader(f.file), + imageSizeGetterInputBuilder: () => AsyncFileInput(f.file), + ); } final _getFileTask = CancelableGetFile(DefaultCacheManager().store); diff --git a/lib/platform/metadata_loader.dart b/lib/platform/metadata_loader.dart index 9a5dd9c9..71120adf 100644 --- a/lib/platform/metadata_loader.dart +++ b/lib/platform/metadata_loader.dart @@ -1,3 +1,6 @@ +import 'package:exifdart/exifdart.dart'; +import 'package:flutter/foundation.dart'; +import 'package:image_size_getter/image_size_getter.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/entity/file.dart'; @@ -18,4 +21,36 @@ abstract class MetadataLoader { Future> loadFile(Account account, File file); void cancel(); + + @protected + static Future> loadMetadata({ + AbstractBlobReader Function() exifdartReaderBuilder, + AsyncImageInput Function() imageSizeGetterInputBuilder, + }) async { + final metadata = await readMetadata(exifdartReaderBuilder()); + int imageWidth, imageHeight; + if (metadata.imageWidth == null || metadata.imageHeight == null) { + final resolution = + await AsyncImageSizeGetter.getSize(imageSizeGetterInputBuilder()); + imageWidth = resolution.width; + imageHeight = resolution.height; + } else { + if (metadata.rotateAngleCcw != null && + metadata.rotateAngleCcw % 180 != 0) { + imageWidth = metadata.imageHeight; + imageHeight = metadata.imageWidth; + } else { + imageWidth = metadata.imageWidth; + imageHeight = metadata.imageHeight; + } + } + return { + if (metadata.exif != null) "exif": metadata.exif, + if (imageWidth > 0 && imageHeight > 0) + "resolution": { + "width": imageWidth, + "height": imageHeight, + }, + }; + } } diff --git a/lib/web/metadata_loader.dart b/lib/web/metadata_loader.dart index c7c08151..ffdbd647 100644 --- a/lib/web/metadata_loader.dart +++ b/lib/web/metadata_loader.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:exifdart/exifdart_memory.dart'; -import 'package:image_size_getter/image_size_getter.dart'; import 'package:logging/logging.dart'; import 'package:nc_photos/account.dart'; import 'package:nc_photos/api/api.dart'; @@ -27,17 +26,10 @@ class MetadataLoader implements itf.MetadataLoader { response: response, message: "Failed communicating with server: ${response.statusCode}"); } - final resolution = - await AsyncImageSizeGetter.getSize(AsyncMemoryInput(response.body)); - final exif = await readExifFromBytes(response.body); - return { - if (exif != null) "exif": exif, - if (resolution.width > 0 && resolution.height > 0) - "resolution": { - "width": resolution.width, - "height": resolution.height, - }, - }; + return itf.MetadataLoader.loadMetadata( + exifdartReaderBuilder: () => MemoryBlobReader(response.body), + imageSizeGetterInputBuilder: () => AsyncMemoryInput(response.body), + ); } @override diff --git a/pubspec.lock b/pubspec.lock index e02c3f78..aa23357d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -110,11 +110,11 @@ packages: dependency: "direct main" description: path: "." - ref: "1.0.0" - resolved-ref: "6d52c90f5e48dd1a2eeefb04b43d90b993387568" + ref: "1.1.0" + resolved-ref: "3b5712b23252e695c4767eb1be044af18668570d" url: "https://gitlab.com/nkming2/exifdart.git" source: git - version: "1.0.0" + version: "1.1.0" ffi: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 99474dbf..1df6cf95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: exifdart: git: url: https://gitlab.com/nkming2/exifdart.git - ref: 1.0.0 + ref: 1.1.0 flutter_bloc: ^7.0.0 flutter_staggered_grid_view: ^0.3.3 google_maps_flutter: ^2.0.3