3
votes

Convertir une UInt8List en image dans flutter / dart-ui

J'ai ce scénario où je dois obtenir un UInt8List à partir d'une image comme celle-ci:

E/flutter (10201): [ERROR:flutter/lib/ui/painting/codec.cc(97)] Failed decoding image. Data is either invalid, or it is encoded using an unsupported format.
E/flutter (10201): [ERROR:flutter/shell/common/shell.cc(186)] Dart Error: Unhandled exception:
...

Faites quelques manipulations et revenez à une image .

J'ai essayé ce qui suit:

List stuff = image.toByteData().buffer.asUInt8List()
ui.decodeImageFromList(stuff, (image){
  // do stuff with image
});

Mais je continue à recevoir cette exception:

List stuff = image.toByteData().buffer.asUInt8List()

Notez que même sans aucune modification dans la liste, l'exception est levée. Comment puis-je faire en sorte que la liste ait un format encodable?


0 commentaires

4 Réponses :


2
votes

ui.Image peut se transformer en un bitmap RGBA (ou PNG), mais ne peut pas se reconvertir à partir d'un bitmap. (La raison en est qu'il n'y a aucun moyen de dire au codec d'image des choses comme la profondeur de couleur, la géométrie, etc.) La solution consiste à ajouter un en-tête de fichier BMP sur le devant de votre bitmap, où vous pouvez les décrire éléments manquants, puis transmettez-le à instantiateImageCodec . Voir cette réponse , mais notez que dans ce cas, le bitmap en question avait une étrange carte de couleurs remplie. Dans votre cas de RGBA 32 bits, l'en-tête serait encore plus simple.


1 commentaires

Après cette réponse, j'ai commencé à travailler sur quelque chose pour rendre cela plus facile. Je convertis Uint8List en Image avec Bitmap, un package que j'ai créé. Merci. github.com/renancaraujo/bitmap



3
votes

Vous pouvez utiliser la classe MemoryImage pour convertir une Uint8List en image.

var _image = MemoryImage(image);

Vous pouvez trouver plus de détails sur cette classeici


0 commentaires

6
votes

Vous pouvez utiliser l'image mémoire comme indiqué ci-dessous, pour le rendu direct des octets

child: Image.memory(Uint8List bytes);


0 commentaires

0
votes

utilisez ceci.

static Future<ui.Image> bytesToImage(Uint8List imgBytes) async{
    ui.Codec codec = await ui.instantiateImageCodec(imgBytes);
    ui.FrameInfo frame = await codec.getNextFrame();
    return frame.image;
  }


0 commentaires