This commit is contained in:
otsmr 2025-07-18 11:22:14 +02:00
parent aa4654344b
commit 636d4de1b6
3 changed files with 18 additions and 35 deletions

View file

@ -1,40 +1,10 @@
import 'dart:io';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:twonly/src/utils/log.dart';
import 'package:video_thumbnail/video_thumbnail.dart';
Future<void> createThumbnails(String directoryPath) async {
final directory = Directory(directoryPath);
final outputDirectory = await getTemporaryDirectory();
if (directory.existsSync()) {
final files = directory.listSync();
for (final file in files) {
if (file is File) {
final filePath = file.path;
final fileExtension = filePath.split('.').last.toLowerCase();
if (['jpg', 'jpeg', 'png'].contains(fileExtension)) {
// Create thumbnail for images
final image = await decodeImageFromList(file.readAsBytesSync());
final thumbnail = await image.toByteData(format: ImageByteFormat.png);
final thumbnailFile =
File('${outputDirectory.path}/${file.uri.pathSegments.last}');
await thumbnailFile.writeAsBytes(thumbnail!.buffer.asUint8List());
} else if (['mp4', 'mov', 'avi'].contains(fileExtension)) {
// Create thumbnail for videos
}
}
}
}
}
Future<void> createThumbnailsForImage(File file) async {
final fileExtension = file.path.split('.').last.toLowerCase();
if (fileExtension != 'png') {
@ -47,8 +17,8 @@ Future<void> createThumbnailsForImage(File file) async {
minHeight: 800,
minWidth: 450,
file.path,
format: CompressFormat.png,
quality: 30,
format: CompressFormat.webp,
quality: 50,
);
if (imageBytesCompressed == null) {

View file

@ -26,12 +26,18 @@ extension ShortCutsExtension on BuildContext {
}
Future<String?> saveImageToGallery(Uint8List imageBytes) async {
final jpgImages = await FlutterImageCompress.compressWithList(
// ignore: avoid_redundant_argument_values
format: CompressFormat.jpeg,
imageBytes,
quality: 100,
);
final hasAccess = await Gal.hasAccess();
if (!hasAccess) {
await Gal.requestAccess();
}
try {
await Gal.putImageBytes(imageBytes);
await Gal.putImageBytes(jpgImages);
return null;
} on GalException catch (e) {
return e.type.message;

View file

@ -4,6 +4,7 @@ import 'dart:math';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:path/path.dart';
import 'package:twonly/src/services/api/media_upload.dart';
@ -75,10 +76,16 @@ class SaveToGalleryButtonState extends State<SaveToGalleryButton> {
res = await saveVideoToGallery(widget.videoFilePath!.path);
}
} else {
memoryPath += '.png';
final imageBytes = await widget.getMergedImage();
if (imageBytes == null || !mounted) return;
await File(memoryPath).writeAsBytes(imageBytes);
final webPImageBytes =
await FlutterImageCompress.compressWithList(
format: CompressFormat.webp,
imageBytes,
quality: 100,
);
memoryPath += '.png';
await File(memoryPath).writeAsBytes(webPImageBytes);
unawaited(createThumbnailsForImage(File(memoryPath)));
if (storeToGallery) {
res = await saveImageToGallery(imageBytes);