[英]Convert base64 string to Image class and back
我有一個簡單的表,我想通過MOOR創建和維護它。 下面是表定義:
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 小部件和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
。
請注意,問題中的鏈接不正確。 The question refers to the Image
class from the image
package - see 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
為您返回一個 NxM 32 位像素數組(默認情況下按 RGBA 順序),但您不知道圖像的幾何形狀。 100x200 圖像將返回 80,000 字節數組 - 但 200x100 圖像也將返回。 當您重新構建圖像時,您需要告訴它原始的寬度和高度。
這就是存在像 BMP 這樣的文件格式的原因。 他們在像素陣列前面加上 header,其中包含寬度、高度、像素深度、像素順序等信息。package 有一個 BMP 解碼器,但沒有編碼器。 如果您想將寬度和高度編碼到字節數組中,從而編碼到 base64 字符串中,您可以實現一個簡單的 BMP 編碼器。 (請參閱此部分答案。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.