如何将 BASE64字符串转换为图像与扑动?

我转换图像保存在我的 Firebase 数据库到 Base64,并希望解码和编码。我已经研究过类似的问题,但仍然存在错误。这是我目前掌握的情况?

var image1 = String;


var pic = event.snapshot.value['image'];
var photo = BASE64.decode(pic);
image1 = photo;

我得到了下面的错误..。

A value of type "List<int>" cannot be assigned to a variable of type "Type"

如果您能提供一个反向过程,将一个图像编码到 Base64,以便它们可以保存回 Firebase,这将是非常感激的。

最新消息

这是我更新的代码,仍然抛出一个错误。

image1 = event.snapshot.value['image'];
var image = BASE64.decode(image1.toString());
new Image.memory(image),

错误是..。

FormatException: Invalid Length must be a multiple of 4

125079 次浏览

您可以使用 Image.memory构造函数将 Uint8List转换为 Flutter Image小部件。(如果需要,可以使用 Uint8List.fromList构造函数将 List转换为 Uint8List。)你可以用 BASE64.encode走另一条路。

下面是一些示例代码。

screenshot

import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;


void main() {
runApp(new MyApp());
}


class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData.dark(),
home: new MyHomePage(),
);
}
}


class MyHomePage extends StatefulWidget {
@override
State createState() => new MyHomePageState();
}


class MyHomePageState extends State<MyHomePage> {
String _base64;


@override
void initState() {
super.initState();
(() async {
http.Response response = await http.get(
'https://flutter.io/images/flutter-mark-square-100.png',
);
if (mounted) {
setState(() {
_base64 = BASE64.encode(response.bodyBytes);
});
}
})();
}


@override
Widget build(BuildContext context) {
if (_base64 == null)
return new Container();
Uint8List bytes = BASE64.decode(_base64);
return new Scaffold(
appBar: new AppBar(title: new Text('Example App')),
body: new ListTile(
leading: new Image.memory(bytes),
title: new Text(_base64),
),
);
}
}

但是,在数据库中存储大量二进制数据通常是一个坏主意。它没有发挥 Firebase 实时数据库的优势,你最终将浪费带宽传输你不需要的数据,以及不必要的编码和解码。您应该改用 firebase_storage插件,在数据库中存储图像的路径或下载 URL。

Uint8List _bytesImage;


String _imgString = 'iVBORw0KGgoAAAANSUhEUg.....';


_bytesImage = Base64Decoder().convert(_imgString);


Image.memory(_bytesImage)

使用 'dart:convert'包有一种更简单的方法

Image.memory(base64Decode(base64String));

实施方法和一些有用的方法:

import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/widgets.dart';




Image imageFromBase64String(String base64String) {
return Image.memory(base64Decode(base64String));
}


Uint8List dataFromBase64String(String base64String) {
return base64Decode(base64String);
}


String base64String(Uint8List data) {
return base64Encode(data);
}

要打开照相机照片(临时文件夹) ,编辑一个文件,然后将其转换为 Base64:

密码:

import 'dart:convert';
import 'package:image/image.dart' as ImageProcess;


File file = File(imagePath);
final _imageFile = ImageProcess.decodeImage(
file.readAsBytesSync(),
);


...edit file...


String base64Image = base64Encode(ImageProcess.encodePng(_imageFile));

解码并显示:

import 'dart:convert';
import 'package:image/image.dart' as ImageProcess;


final _byteImage = Base64Decoder().convert(base64Image);
Widget image = Image.memory(_byteImage)

用这个简单的方法,我可以设置一个图像在颤振。Image 属性是作为字符串的 base64图像,例如:

TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb2

试试下一个:

Widget getImagenBase64(String imagen) {
_imageBase64 = imagen;
const Base64Codec base64 = Base64Codec();
if (_imageBase64 == null) return new Container();
bytes = base64.decode(_imageBase64);
return Image.memory(
bytes,
width: 200,
fit: BoxFit.fitWidth,
       

);
}

我希望这对你有用,编程愉快。

进口

import 'dart:convert';
import 'dart:typed_data';

从屏幕加载数据并分配给这个变量

    Uint8List _bytes;
_bytes = Base64Decoder().convert("iVBORw0KGgoAAAANSUhEUgAAANgAAA......");

代码树结构小部件

Image.memory(_bytes)