簡體   English   中英

將 base64 字符串轉換為圖像 class 並返回

[英]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字段,我想使用Imagebase64轉換並返回。 請注意,我指的是 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());
  }
}

正如你所看到的,我沒有問題(我猜)實現Imagebase64轉換,但是我很難實現base64Image

請注意,問題中的鏈接不正確。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM