flutter如何从uint8list计算下载图片的宽高

在Flutter中,我得到了一个图片的uint8list数据,但不知道如何从中计算出图片的实际宽高?有没有直接解析的方法,而不需要先保存为文件或显示到屏幕上?

2 回复

使用Flutter的Image.memory方法加载Uint8List,通过Image组件的image属性获取ImageInfo,然后从ImageInfo中读取宽高信息。

更多关于flutter如何从uint8list计算下载图片的宽高的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,可以通过以下方法从 Uint8List 计算下载图片的宽高:

方法1:使用 Image.memoryImageStreamListener

import 'package:flutter/material.dart';
import 'dart:typed_data';

void getImageDimensions(Uint8List imageData) async {
  final ImageStream stream = Image.memory(imageData).image.resolve(ImageConfiguration.empty);
  
  stream.addListener(ImageStreamListener((ImageInfo info, bool _) {
    int width = info.image.width;
    int height = info.image.height;
    print('图片尺寸: $width x $height');
    // 在这里使用宽高数据
  }));
}

方法2:使用 Image.memory 配合 Completer

import 'dart:typed_data';
import 'package:flutter/material.dart';

Future<Size> getImageSize(Uint8List bytes) async {
  final Completer<Size> completer = Completer();
  final Image image = Image.memory(bytes);
  
  image.image.resolve(ImageConfiguration.empty).addListener(
    ImageStreamListener((ImageInfo info, bool _) {
      completer.complete(Size(
        info.image.width.toDouble(),
        info.image.height.toDouble()
      ));
    })
  );
  
  return completer.future;
}

// 使用示例
Uint8List imageData = ... // 你的图片数据
Size size = await getImageSize(imageData);
print('宽: ${size.width}, 高: ${size.height}');

方法3:使用 image 包(推荐用于本地处理)

首先添加依赖:

dependencies:
  image: ^3.0.2

代码实现:

import 'dart:typed_data';
import 'package:image/image.dart' as img;

Size getImageDimensions(Uint8List bytes) {
  final image = img.decodeImage(bytes);
  if (image != null) {
    return Size(image.width.toDouble(), image.height.toDouble());
  }
  throw Exception('无法解析图片数据');
}

// 使用
try {
  Size dimensions = getImageDimensions(imageData);
  print('宽: ${dimensions.width}, 高: ${dimensions.height}');
} catch (e) {
  print('错误: $e');
}

推荐方案

  • 网络图片:使用方法1或2
  • 本地图片处理:使用方法3(image包性能更好)
  • 注意:方法1和2需要Widget树构建完成,方法3可直接在任意地方使用

选择哪种方法取决于你的具体使用场景和性能需求。

回到顶部