80 lines
2.4 KiB
Dart
80 lines
2.4 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
import 'package:logging/logging.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:path/path.dart' as path;
|
|
import 'package:uuid/uuid.dart';
|
|
import 'package:image/image.dart' as img;
|
|
import 'package:uuid/v5.dart';
|
|
|
|
class ImagesManager
|
|
{
|
|
static final ImagesManager instance = ImagesManager._internal();
|
|
ImagesManager._internal();
|
|
|
|
static final Logger log = Logger("ImagesManager");
|
|
|
|
static Uri? _imagesDirectory;
|
|
|
|
Future<Uri> get imageDirectory async
|
|
{
|
|
if(_imagesDirectory != null) return _imagesDirectory!;
|
|
await _initImagesDirectory();
|
|
return _imagesDirectory!;
|
|
}
|
|
|
|
Future _initImagesDirectory() async
|
|
{
|
|
final directoryLoc = await getApplicationDocumentsDirectory();
|
|
final directoryName = "images";
|
|
final directoryPath = path.join(directoryLoc.path, directoryName);
|
|
final directoryUri = Uri.directory(directoryPath);
|
|
final directory = Directory.fromUri(directoryUri);
|
|
|
|
if(!await directory.exists())
|
|
{
|
|
log.info("Image directory does not yet extists. Creating it.");
|
|
}
|
|
|
|
directory.create(recursive: false);
|
|
|
|
log.info("Image directory set up at '$directory'");
|
|
|
|
_imagesDirectory = directoryUri;
|
|
}
|
|
|
|
Future<String?> createImage(ImageSource source) async
|
|
{
|
|
// Get image from camera or not
|
|
final XFile? ximage = await ImagePicker().pickImage(source: source);
|
|
if(ximage == null) return null;
|
|
|
|
final uuid = Uuid().v6();
|
|
final imageDir = await imageDirectory;
|
|
ximage.saveTo(path.join(imageDir.path, uuid + path.extension(ximage.name)));
|
|
return uuid;
|
|
}
|
|
|
|
Future<Image?> loadImage(String imageUuid) async
|
|
{
|
|
final imageDir = await imageDirectory;
|
|
if(!Uuid.isValidUUID(fromString: imageUuid))
|
|
{
|
|
log.warning("Tried to load an image with an invalid UUID : '$imageUuid'.");
|
|
return null;
|
|
}
|
|
|
|
final imagePath = path.join(imageDir.path, "$imageUuid.jpg");
|
|
final file = File(imagePath);
|
|
if(!await file.exists())
|
|
{
|
|
log.warning("Tried to load an image that does not extist: '$imagePath'.");
|
|
return null;
|
|
}
|
|
|
|
return Image.file(file);
|
|
}
|
|
}
|