generateThumbnail static method

Future<ImageResult<Uint8List>> generateThumbnail(
  1. dynamic source, {
  2. int maxWidth = 150,
  3. int maxHeight = 150,
  4. int quality = 80,
  5. ThumbnailFormat format = ThumbnailFormat.jpeg,
  6. String? cacheDir,
})

生成缩略图

source 图片来源,支持:

  • String:本地文件路径或网络 URL(以 http://https:// 开头)
  • Uint8List:原始字节数据

maxWidth 最大宽度(像素),默认 150 maxHeight 最大高度(像素),默认 150 quality JPEG 压缩质量(1-100),默认 80;PNG/WebP 忽略此参数 format 输出格式,默认 ThumbnailFormat.jpeg cacheDir 自定义缓存目录,默认使用系统临时目录/thumbnails

返回 ImageResult<Uint8List>,data 为缩略图字节数据。

内部实现自动对相同参数生成的缩略图进行缓存(缓存目录内文件名含参数哈希), 缓存命中时跳过解码直接返回。

Implementation

static Future<ImageResult<Uint8List>> generateThumbnail(
  dynamic source, {
  int maxWidth = 150,
  int maxHeight = 150,
  int quality = 80,
  ThumbnailFormat format = ThumbnailFormat.jpeg,
  String? cacheDir,
}) async {
  if (maxWidth <= 0 || maxHeight <= 0) {
    return const ImageResult.failure('maxWidth 和 maxHeight 必须大于 0');
  }
  if (source == null) {
    return const ImageResult.failure('source 不能为空');
  }

  try {
    // 生成缓存 key,检查缓存
    final key = _cacheKey(source, maxWidth, maxHeight, quality, format);
    final cachePath = await _getCacheFilePath(key, cacheDir: cacheDir);
    final cacheFile = File(cachePath);

    if (await _isCacheValid(cacheFile)) {
      return ImageResult.success(await cacheFile.readAsBytes());
    }

    // 获取原始字节
    final bytes = await _fetchBytes(source);

    // 解码并缩放
    final thumbnailBytes = _generateThumbnailBytes(
      bytes,
      maxWidth,
      maxHeight,
      quality,
      format,
    );

    // 写入缓存
    await cacheFile.writeAsBytes(thumbnailBytes);

    return ImageResult.success(thumbnailBytes);
  } catch (e) {
    return ImageResult.failure(e.toString());
  }
}