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?
4 Réponses :
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.
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
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
Vous pouvez utiliser l'image mémoire comme indiqué ci-dessous, pour le rendu direct des octets
child: Image.memory(Uint8List bytes);
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; }