如何在Flutter中将图片转换为文件?

6

我正在编写Flutter代码,在Image小部件中放置了图像,并希望将其转换为文件,以便可以将其上传到Firebase存储。

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

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

@Uni 我不是从照片或相机中选择图像。它存在于资产文件夹中。 - Jayant Jeet Tomar
3个回答

7

特别感谢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),
}

你的代码中这部分是做什么用的? File file = File('$tempPath/profile.png'); await file.writeAsBytes( bytes.buffer.asUint8List(bytes.offsetInBytes, bytes.lengthInBytes));``` - Javier Heisecke
文件路径(profile.png)是您将要放置文件的位置,bytes.buffer.asUint8List(..则负责将“内存中的文件”写入设备。 - Andres Paladines
你好 @JavierHeisecke,这行代码:(await getTemporaryDirectory()).path 只是获取应用程序内临时路径目录,File 创建一个空文件,file.writeAsBytes 只是获取之前提供的数据字节并将其保存在空文件中。 - undefined

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;
}

0

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

你需要安装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;


无法工作。抛出此错误。[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理的异常:FileSystemException: 无法打开文件,路径='/data/user/0/com.example.xyz/cache/images/profile.png' (OS Error: No such file or directory, errno = 2) - Jayant Jeet Tomar
try to replace the \ with / - Sami Kanafani
出现了以下错误。它返回了null。在构建UserSignUpScreen(dirty, state: _UserSignUpScreenState#e96f8)时抛出了以下断言: 'package:flutter/src/painting/image_provider.dart': 断言失败:第826行,第14个位置:'file != null':不为真。 - Jayant Jeet Tomar
找到了问题,从文件构造函数中移除 /image,我编辑了答案。 - Sami Kanafani
如何将PNG转换为JPG,请提供建议。谢谢。 - Kamlesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接