Флаттер изменяет размер изображения перед загрузкой - PullRequest
0 голосов
/ 02 октября 2018

Мне нужно изменить размер изображений перед загрузкой на сервер.

Я использую io и пакет изображений.

import 'dart:io';  
import 'package:image/image.dart' as Img;

, используя эту функцию

uploadImages(File image_File) async {

    Img.Image image_temp = Img.decodeImage(image_File.readAsBytesSync());

    Img.Image resized_img = Img.copyResize(image_temp, 800);

    File resized_file = File('resized_img.jpg')
      ..writeAsBytesSync(Img.encodeJpg(resized_img));

    var stream = new http.ByteStream(DelegatingStream.typed(resized_file.openRead()));
    var length = await resized_file.length();

    var uri = Uri.parse("https://myserver.com/upload.php");

    var request = new http.MultipartRequest("POST", uri);
    var multipartFile = new http.MultipartFile('file', stream, length,
        filename: p.basename("resized_image.jpg"));


    request.files.add(multipartFile);
    var response = await request.send();
    print(response.statusCode);
    response.stream.transform(utf8.decoder).listen((value) {
      print(value);
    });
  }

КогдаЯ запускаю этот код, и приложение просто зависает, а изображения не загружаются на сервер.

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Пока я использую

package:image/image.dart

для решения следующих проблем

  • отображение пустой страницы при преобразовании изображения (может потребоваться слишком много времени при сжатии изображения)
  • После сжатия изображение растянулось и выглядело не очень хорошо

Затем использовался плагин ниже, тот же работает нормально, без проблем, даже быстрее и что я ожидал

https://github.com/btastic/flutter_native_image.git

шаги и метод доступны по ссылке выше.

0 голосов
/ 02 октября 2018

Нет необходимости записывать его в файл;Вы можете отправить изображение с измененным размером непосредственно из памяти.

uploadImages(File image_File) async {
  img.Image image_temp = img.decodeImage(image_File.readAsBytesSync());
  img.Image resized_img = img.copyResize(image_temp, 800);

  var request = new http.MultipartRequest(
    'POST',
    Uri.parse('https://myserver.com/upload.php'),
  );
  var multipartFile = new http.MultipartFile.fromBytes(
    'file',
    img.encodeJpg(resized_img),
    filename: 'resized_image.jpg',
    contentType: MediaType.parse('image/jpeg'),
  );

  request.files.add(multipartFile);
  var response = await request.send();
  print(response.statusCode);
  response.stream.transform(utf8.decoder).listen((value) {
    print(value);
  });
}

Примечание. При импорте пакетов следует использовать строчную метку (например, img).Вам нужно будет импортировать package:http_parser, чтобы получить MediaType.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...