0

我有一个简单的表,我想通过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 类,而不是小部件。我已经找到了在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.

4

1 回答 1

1

请注意,问题中的链接不正确。问题是指包中的Imageimage- 请参阅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 这样的文件格式的原因。它们在像素数组前面加上一个包含宽度、高度、像素深度、像素顺序等信息的标题。该包有一个 BMP 解码器,但没有编码器。如果您想将宽度和高度编码为字节数组并因此编码为 base64 字符串,您可以实现一个简单的 BMP 编码器。(请参阅此部分答案。)

于 2020-07-08T12:48:15.813 回答