将 base64 字符串转换为图像 class 并返回
Convert base64 string to Image class and back
我有一个简单的 table,我想通过 MOOR 创建和维护它。以下是 table 定义:
class Plants extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text()();
TextColumn get image => text().map(const ImageConverter()).nullable()();
}
如您所见,我有一个 image
字段,我想使用 Image
到 base64
的转换和返回。请注意,我指的是 Flutter Image class,而不是小部件。
我已经找到了 ,其中 Image widget 和 base64 之间发生了转换,但在我看来这不是架构在数据层上使用小部件的观点。
这是我到目前为止所做的:
import 'package:image/image.dart';
import 'dart:convert';
import 'dart:typed_data';
import 'package:moor/moor.dart';
class ImageConverter extends TypeConverter<Image, String> {
Image _imageFromBase64String(String base64String) {
return null; // <--- missing implementation
}
Uint8List _dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
String _base64String(Uint8List data) {
return base64Encode(data);
}
const ImageConverter();
@override
Image mapToDart(String fromDb) {
if (fromDb == null) {
return null;
}
return _imageFromBase64String(fromDb);
}
@override
String mapToSql(Image value) {
if (value == null) {
return null;
}
return _base64String(value.getBytes());
}
}
如您所见,我(我猜)实现 Image
到 base64
的转换没有问题,但是我很难实现 base64
到 Image
。
请注意问题中的link是不正确的。问题涉及 image
包中的 Image
class - 请参阅 https://pub.dev/documentation/image/latest/image/Image-class.html
你需要一对这样的函数:
Image b64ToImage(int width, int height, String b64) {
return Image.fromBytes(width, height, base64.decode(b64));
}
String imageToB64(Image image) => base64.encode(image.getBytes());
getBytes
return 为您提供了一个 NxM 32 位像素数组(默认为 RGBA 顺序),但您不知道图像的几何形状。一张 100x200 的图像将 return 一个 80,000 字节的数组 - 但 200x100 的图像也是如此!当您 re-construct 图像时,您需要告诉它原始宽度和高度。
这就是 BMP 等文件格式存在的原因。他们在像素数组前加上一个 header 前缀,其中包含宽度、高度、像素深度、像素顺序等信息。该包具有 BMP 解码器,但没有编码器。如果您想将宽度和高度编码到字节数组中,从而编码到 base64 字符串中,您可以实现一个简单的 BMP 编码器。 (见此 partial answer。)
我有一个简单的 table,我想通过 MOOR 创建和维护它。以下是 table 定义:
class Plants extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get name => text()();
TextColumn get image => text().map(const ImageConverter()).nullable()();
}
如您所见,我有一个 image
字段,我想使用 Image
到 base64
的转换和返回。请注意,我指的是 Flutter Image class,而不是小部件。
我已经找到了
import 'package:image/image.dart';
import 'dart:convert';
import 'dart:typed_data';
import 'package:moor/moor.dart';
class ImageConverter extends TypeConverter<Image, String> {
Image _imageFromBase64String(String base64String) {
return null; // <--- missing implementation
}
Uint8List _dataFromBase64String(String base64String) {
return base64Decode(base64String);
}
String _base64String(Uint8List data) {
return base64Encode(data);
}
const ImageConverter();
@override
Image mapToDart(String fromDb) {
if (fromDb == null) {
return null;
}
return _imageFromBase64String(fromDb);
}
@override
String mapToSql(Image value) {
if (value == null) {
return null;
}
return _base64String(value.getBytes());
}
}
如您所见,我(我猜)实现 Image
到 base64
的转换没有问题,但是我很难实现 base64
到 Image
。
请注意问题中的link是不正确的。问题涉及 image
包中的 Image
class - 请参阅 https://pub.dev/documentation/image/latest/image/Image-class.html
你需要一对这样的函数:
Image b64ToImage(int width, int height, String b64) {
return Image.fromBytes(width, height, base64.decode(b64));
}
String imageToB64(Image image) => base64.encode(image.getBytes());
getBytes
return 为您提供了一个 NxM 32 位像素数组(默认为 RGBA 顺序),但您不知道图像的几何形状。一张 100x200 的图像将 return 一个 80,000 字节的数组 - 但 200x100 的图像也是如此!当您 re-construct 图像时,您需要告诉它原始宽度和高度。
这就是 BMP 等文件格式存在的原因。他们在像素数组前加上一个 header 前缀,其中包含宽度、高度、像素深度、像素顺序等信息。该包具有 BMP 解码器,但没有编码器。如果您想将宽度和高度编码到字节数组中,从而编码到 base64 字符串中,您可以实现一个简单的 BMP 编码器。 (见此 partial answer。)