Charles Jr
Charles Jr

Reputation: 9109

How to read bytes of a local image file in Dart/Flutter?

I would like to use a placeholder image file that I've added to my code as "assets/placeholder.png", but I'm getting a File not found error. This is how I'm doing it from the dartlang documentation...

var bytes = await new File('assets/placeholder.png').readAsBytes();
String base64 = CryptoUtils.bytesToBase64(bytes);

The bytes variable errors every time. How can I save the bytes of a locally saved image file?

Upvotes: 29

Views: 79953

Answers (5)

Felipe D. Silva
Felipe D. Silva

Reputation: 594

import 'dart:convert';
import 'package:flutter/services.dart';

...

ByteData byteData = await rootBundle.load('assets/image.png');

Uint8List bytes = byteData.buffer.asUint8List();

String base64Image = base64.encode(bytes);

Upvotes: 12

Ali Bagheri
Ali Bagheri

Reputation: 3409

if need read some bytes, use this

Future<Uint8List> readFileBytes(String path, int len) async {
    final File file = File(path);
    RandomAccessFile fileOpen = await file.open(mode: FileMode.read);

    int count = 0;
    List<int> bytes = [];
    int byte;

    while (byte != -1 && count < len) {
      byte = fileOpen.readByteSync();
      bytes.add(byte);
      count++;
    }

    await fileOpen.close();
    return Uint8List.fromList(bytes);
  }

Upvotes: 1

live-love
live-love

Reputation: 52366

Here is an example to read file byte by byte:

import 'dart:io';

void main(List<String> arguments) {
  readFileByteByByte().then((done) {
    print('done');
  });
  print('waiting...');
  print('do something else while waiting...');
}

Future<bool> readFileByteByByte() async {
  //final fileName = 'C:\\code\\test\\file_test\\bin\\main.dart'; // use your image file name here
  final fileName = Platform.script.toFilePath(); //this will read this text file as an example
  final script = File(fileName);
  final file = await script.open(mode: FileMode.read);

  var byte;
  while (byte != -1) {
    byte = await file.readByte();
    if (byte == ';'.codeUnitAt(0)) { //check if byte is semicolon
      print(byte);
    }
  }
  await file.close();
  return (true);
}

Upvotes: 2

Wajid khan
Wajid khan

Reputation: 872

In dart Uint8List is equal to byte[].

  1. Create one function and pass file path, It will return Bytes.

    Future<Uint8List> _readFileByte(String filePath) async {
        Uri myUri = Uri.parse(filePath);
        File audioFile = new File.fromUri(myUri);
        Uint8List bytes;
        await audioFile.readAsBytes().then((value) {
        bytes = Uint8List.fromList(value); 
        print('reading of bytes is completed');
      }).catchError((onError) {
          print('Exception Error while reading audio from path:' +
          onError.toString());
      });
      return bytes;
    }
    
  2. Now call the function in to get bytes of file.

    try{
      Uint8List audioByte;
      String myPath= 'MyPath/abc.png';
      _readFileByte(myPath).then((bytesData) {
        audioByte = bytesData;
      //do your task here 
      });
    } catch (e) {
       // if path invalid or not able to read
      print(e);
    }
    
  3. If you want base64String then use below code:

    String audioString = base64.encode(audioByte);

for base64 import 'dart:convert';

I hope it will help!

Upvotes: 19

Hadrien Lejard
Hadrien Lejard

Reputation: 5894

With Flutter environment, you have to use AssetBundle if you want to access to your assets (https://flutter.io/assets-and-images/).

import 'package:flutter/services.dart' show rootBundle;


ByteData bytes = await rootBundle.load('assets/placeholder.png');

Upvotes: 43

Related Questions