【问题标题】:How to convert Image to File in Flutter?如何在 Flutter 中将图像转换为文件?
【发布时间】:2020-10-03 17:22:06
【问题描述】:

我正在编写这个颤振代码,其中我在图像小部件中有图像,我想将其转换为文件,以便我可以将其上传到 Firebase 存储。

Image _image = Image.asset('assets\images\profile.png');
File _fileImage = convertToFile(_image);
//upload _fileImage to Firebase Storage code

我需要File convertToFile(Image img) 函数。

【问题讨论】:

  • @Uni 我不是从照片或相机中挑选图像。它存在于资产文件夹中。

标签: image file flutter dart type-conversion


【解决方案1】:

特别感谢sami kanafani

这是我的解决方案(非常适合我):

import 'dart:async';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';

class ImageUtils {
  static Future<File> imageToFile({String imageName, String ext}) async {
    var bytes = await rootBundle.load('assets/$imageName.$ext');
    String tempPath = (await getTemporaryDirectory()).path;
    File file = File('$tempPath/profile.png');
    await file.writeAsBytes(
        bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));
    return file;
  }
}


class AnotherClass {
    File imagePlaceHolder;
    _setPlaceHolder() async {
         this.imagePlaceHolder = await ImageUtils.imageToFile(
         imageName: "photo_placeholder", ext: "jpg");
    }

    ...
    Image.file(this.imagePlaceHolder),
}

【讨论】:

  • 这部分代码在做什么? String tempPath = (await getTemporaryDirectory()).path; File file = File('$tempPath/profile.png'); await file.writeAsBytes( bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));
  • 是放置文件 (profile.png) 的路径,而 bytes.buffer.asUint8List(.. 负责将“内存中的文件”写入设备。
【解决方案2】:

我遇到了完全相同的问题,并使用了本指南: https://medium.com/@mrgulshanyadav/convert-image-url-to-file-format-in-flutter-10421bccfd18(作者 Gulshan Yadav)

使用这些导入:

import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'dart:io';
import 'dart:math'; 

还有这个功能:

Future<File> urlToFile(String imageUrl) async {
// generate random number.
var rng = new Random();
// get temporary directory of device.
Directory tempDir = await getTemporaryDirectory();
// get temporary path from temporary directory.
String tempPath = tempDir.path;
// create a new file in temporary path with random file name.
File file = new File('$tempPath'+ (rng.nextInt(100)).toString() +'.png');
// call http.get method and pass imageUrl into it to get response.
http.Response response = await http.get(imageUrl);
// write bodyBytes received in response to file.
await file.writeAsBytes(response.bodyBytes);
// now return the file which is created with random name in 
// temporary directory and image bytes from response is written to // that file.
return file;
}

【讨论】:

    【解决方案3】:

    您需要转换资产而不是图像

    你需要安装path_provider插件

    
      var bytes = await rootBundle.load('assets\images\profile.png');
      String tempPath = (await getTemporaryDirectory()).path;
      File file = File('$tempPath/profile.png');
      await file.writeAsBytes(bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));
    
      return file;
    
    

    【讨论】:

    • 不起作用。抛出此错误。 [错误:flutter/lib/ui/ui_dart_state.cc(157)]未处理的异常:FileSystemException:无法打开文件,路径='/data/user/0/com.example.xyz/cache/images/profile.png'(操作系统错误:没有这样的文件或目录,errno = 2)
    • 尝试将 \ 替换为 /
    • 收到此错误。它返回空值。构建 UserSignUpScreen(dirty, state: _UserSignUpScreenState#e96f8): 'package:flutter/src/painting/image_provider.dart': 失败的断言: line 826 pos 14: 'file != null': is not true.
    • 发现问题,从文件构造函数中删除 /image,我编辑了答案
    • 如何将png转为jpg,请指教。谢谢。
    猜你喜欢
    • 2020-04-19
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多