简体   繁体   English

我无法将调整后的图像 object 转换为 Dart 中的 Base64 字符串

[英]I cannot convert resized Image object to Base64 string in Dart

I want to resize Image received form imagepicker in Flutter and send it to database in base64 format.我想调整 Flutter 中从 imagepicker 接收到的图像的大小,并将其以 base64 格式发送到数据库。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:geolocator/geolocator.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:convert';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:path_provider/path_provider.dart';
import 'package:image/image.dart'as img;


class _MyHomePageState extends State<MyHomePage> {
  File pickedImage;
  var text = '';


  bool imageLoaded = false;

  Future pickImage() async {
    var awaitImage = await ImagePicker.pickImage(source: ImageSource.gallery);

    setState(() {
      pickedImage = awaitImage;
      imageLoaded = true;
      text="";
    });

 Future<http.Response> postRequest ( text) async {
    var url ="http://sethbrundle-001-site1.itempurl.com/api/gen";
    var url2 ="http://sethbrundle-001-site1.itempurl.com/api/gen2";

    //List<int> imageBytes = pickedImage.readAsBytesSync();
    img.Image image = img.decodeImage(pickedImage.readAsBytesSync());
    var resized_image= img.copyResize(image, width:120);
    String  base64Image = base64Encode(resized_image.getBytes());
    }
    }


I dont know why but after this image is not recognizable.我不知道为什么,但在这张图片无法识别之后。

To make it work, I just saved the file and converted the saved file to base64.为了使它工作,我只是保存了文件并将保存的文件转换为 base64。 So just save the resized image and then convert the file that you just saved.所以只需保存调整大小的图像,然后转换刚刚保存的文件。 have a loot at this:有一个战利品:

class _MyHomePageState extends State<MyHomePage> {
  File pickedImage;
  var text = '';
  int imageHeight = 0;
  int imageHeightResized = 0;
  Uint8List _bytesImage;
  bool imageLoaded = false;

  Future pickImage() async {
    var awaitImage = await ImagePicker.pickImage(source: ImageSource.gallery);
    setState(() {
      pickedImage = awaitImage;
      img.Image image = img.decodeImage(pickedImage.readAsBytesSync());
      imageHeight = image.height;
      imageLoaded = true;
      text = "";
    });

    img.Image image = img.decodeImage(pickedImage.readAsBytesSync());
    var resizedImage = img.copyResize(image, height: 120, width: 120);

    //Get a path to save the resized file
    final directory = await getApplicationDocumentsDirectory();
    String path = directory.path;

    // Save file 
    File resizedFile = File('$path/resizedImage.jpg')
      ..writeAsBytesSync(img.encodePng(resizedImage));

    setState(() {
      imageHeightResized = resizedImage.height;
      // Convert saved file to base64, you can use this to send to your API
      String base64Image = base64Encode(resizedFile.readAsBytesSync());

      // Decoding the file here to show in the app, this is just to show that it works fine
      _bytesImage = Base64Decoder().convert(base64Image);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                pickImage();
              },
              child: Text('Pick Image'),
            ),
            pickedImage == null
                ? Container()
                : Image.file(
                    pickedImage,
                    height: 200,
                  ),
            Text('image height = $imageHeight'),
            Text('image height resized = $imageHeightResized'),
            _bytesImage == null ? Container() : Image.memory(_bytesImage),
          ],
        ),
      ),
    );
  }
}

You can do base64 encoding as follows.您可以按如下方式进行 base64 编码。

import 'package:image/image.dart' as img;

...

img.Image image = img.decodeImage(pickedImage.readAsBytesSync());
var resized_image= img.copyResize(image, width: 120);
String base64Image = base64Encode(img.encodePng(resized_image));

Note the difference is that, one has to encode the image to an intermediate format (say .png )请注意,不同之处在于,必须将图像编码为中间格式(例如.png

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM