image_util.dart 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'dart:io';
  2. import 'dart:typed_data';
  3. import 'package:clean/model/asset_info.dart';
  4. import 'package:intl/intl.dart';
  5. import 'package:wechat_assets_picker/wechat_assets_picker.dart';
  6. import 'file_utils.dart';
  7. class ImageUtil {
  8. // 生成月份 key (用于内部存储)
  9. static String getMonthKey(DateTime date) {
  10. return '${date.year}-${date.month.toString().padLeft(2, '0')}';
  11. }
  12. // 格式化月份显示 (例如: Jan 2025)
  13. static String formatMonthKey(String monthKey) {
  14. final parts = monthKey.split('-');
  15. if (parts.length == 2) {
  16. final date = DateTime(int.parse(parts[0]), int.parse(parts[1]));
  17. return DateFormat('MMM yyyy').format(date);
  18. }
  19. return monthKey;
  20. }
  21. // 获取指定索引的月份显示文本
  22. static String getMonthText(Map<String, List<AssetInfo>> assets, int index) {
  23. final monthKeys = assets.keys.toList()
  24. ..sort((a, b) => b.compareTo(a)); // 最新的月份在前
  25. if (index < monthKeys.length) {
  26. return formatMonthKey(monthKeys[index]);
  27. }
  28. return '';
  29. }
  30. // 获取指定月份的图片
  31. static List<AssetInfo> getMonthAssets(Map<String, List<AssetInfo>> assets, int index) {
  32. final monthKeys = assets.keys.toList()
  33. ..sort((a, b) => b.compareTo(a)); // 最新的月份在前
  34. if (index < monthKeys.length) {
  35. return assets[monthKeys[index]] ?? [];
  36. }
  37. return [];
  38. }
  39. // 获取缩略图数据
  40. static Future<Uint8List?> getImageThumbnail(AssetInfo asset) async {
  41. try {
  42. // 先尝试从本地读取缩略图
  43. final localThumb = await FileUtils.getThumbData(asset.id.substring(0, 36));
  44. if (localThumb != null) {
  45. return localThumb;
  46. }
  47. // 如果本地没有,则从 AssetEntity 获取
  48. return await asset.thumbnailData;
  49. } catch (e) {
  50. print('获取缩略图失败: $e');
  51. return null;
  52. }
  53. }
  54. // 获取原始图片文件
  55. static Future<File?> getImageFile(AssetInfo asset) async {
  56. try {
  57. // 先尝试从本地读取
  58. final assetPath = await FileUtils.getAssetPath();
  59. final localFile = File('$assetPath/${asset.id.substring(0, 36)}.jpg');
  60. if (await localFile.exists()) {
  61. return localFile;
  62. }
  63. // 如果本地没有,则从 AssetEntity 获取
  64. return asset.file;
  65. } catch (e) {
  66. print('获取图片文件失败: $e');
  67. return null;
  68. }
  69. }
  70. }