Невозможно отобразить обработанное изображение во FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Невозможно отобразить обработанное изображение во Flutter

Сообщение Anonymous »

Я разрабатываю приложение Flutter для Android. Я хочу использовать встроенное приложение камеры, чтобы сделать фотографию, обрезать ее, показать и позже отправить через REST.
Отображение в том виде, в котором оно было снято, работает:

Код: Выделить всё

import 'package:flutter/material.dart'
show
BuildContext,
CircularProgressIndicator,
FutureBuilder,
MaterialApp,
Scaffold,
StatelessWidget,
Widget,
runApp;
import 'package:flutter/material.dart' as material_widget;
import 'package:flutter/widgets.dart' show ConnectionState;
import 'package:image_picker/image_picker.dart'
show ImagePicker, ImageSource, XFile;

void main() {
runApp(
const MyApp(),
);
}

class MyApp extends StatelessWidget {
const MyApp({
super.key,
});

@override
Widget build(
BuildContext context,
) {
return const MaterialApp(
title: 'Flutter Crop Debug',
home: MyHomePage(),
);
}
}

class MyHomePage extends StatelessWidget {
const MyHomePage({
super.key,
});

@override
Widget build(
BuildContext context,
) {
return Scaffold(
body: FutureBuilder(
future: getFuture(),
builder: (
context,
snapshot,
) {
if ((snapshot.connectionState == ConnectionState.done) &&
(snapshot.data != null)) {
return snapshot.data!;
} else {
return const CircularProgressIndicator();
}
},
),
);
}

Future getFuture() async {
final ImagePicker picker = ImagePicker();

final XFile? photoFile = await picker.pickImage(
source: ImageSource.camera,
);

return material_widget.Image.memory(
await photoFile!.readAsBytes(),
);
}
}
Однако, когда я пытаюсь обрезать его, это не работает:

Код: Выделить всё

import 'dart:math' show min;

import 'package:flutter/material.dart'
show
BuildContext,
CircularProgressIndicator,
FutureBuilder,
MaterialApp,
Scaffold,
StatelessWidget,
Widget,
debugPrint,
runApp;
import 'package:flutter/material.dart' as material_widget;
import 'package:flutter/widgets.dart' show ConnectionState;
import 'package:image/image.dart' show copyCrop, decodeJpg;
import 'package:image_picker/image_picker.dart'
show ImagePicker, ImageSource, XFile;

void main() {
runApp(
const MyApp(),
);
}

class MyApp extends StatelessWidget {
const MyApp({
super.key,
});

@override
Widget build(
BuildContext context,
) {
return const MaterialApp(
title: 'Flutter Crop Debug',
home: MyHomePage(),
);
}
}

class MyHomePage extends StatelessWidget {
const MyHomePage({
super.key,
});

@override
Widget build(
BuildContext context,
) {
return Scaffold(
body: FutureBuilder(
future: getFuture(),
builder: (
context,
snapshot,
) {
if ((snapshot.connectionState == ConnectionState.done) &&
(snapshot.data != null)) {
return snapshot.data!;
} else {
return const CircularProgressIndicator();
}
},
),
);
}

Future getFuture() async {
final ImagePicker picker = ImagePicker();

final XFile? photoFile = await picker.pickImage(
source: ImageSource.camera,
);

final photoImage = decodeJpg(
await photoFile!.readAsBytes(),
)!;

final x = (photoImage.width > photoImage.height)
? ((photoImage.width - photoImage.height) ~/ 2)
: 0;

final y = (photoImage.height >  photoImage.width)
? ((photoImage.height - photoImage.width) ~/ 2)
: 0;

final dimension = min(
photoImage.width,
photoImage.height,
);

final photoImageSquared = copyCrop(
photoImage,
x: x,
y: y,
width: dimension,
height: dimension,
);

debugPrint('works up to here');

return material_widget.Image.memory(
photoImageSquared.getBytes(),
);
}
}
Я получаю:

Код: Выделить всё

I/flutter ( 4979): works up to here
E/FlutterJNI( 4979): Failed to decode image
E/FlutterJNI( 4979): android.graphics.ImageDecoder$DecodeException: Failed to create image decoder with message 'unimplemented'Input contained an error.
E/FlutterJNI( 4979):    at android.graphics.ImageDecoder.nCreate(Native Method)
E/FlutterJNI( 4979):    at android.graphics.ImageDecoder.-$$Nest$smnCreate(Unknown Source:0)
E/FlutterJNI( 4979):    at android.graphics.ImageDecoder$ByteBufferSource.createImageDecoder(ImageDecoder.java:254)
E/FlutterJNI( 4979):    at android.graphics.ImageDecoder.decodeBitmapImpl(ImageDecoder.java:1981)
E/FlutterJNI( 4979):    at android.graphics.ImageDecoder.decodeBitmap(ImageDecoder.java:1973)
E/FlutterJNI( 4979):    at io.flutter.embedding.engine.FlutterJNI.decodeImage(FlutterJNI.java:561)
Я попробовал несколько вещей. Максимум, что я смог найти, это то, что в первом случае в Image.memory передается Uint8List, а во втором случае — Uint8ArrayView. Несмотря на то, что один должен расширять другой, я попробовал несколько разных способов его конвертировать, но ничего не помогло.
Я также где-то читал, что это связано с проблемой эмулятора. Однако я тестировал на реальном устройстве, и произошло то же самое.
Пожалуйста, помогите мне узнать, что нужно, чтобы это работало.
Вот репо с MWE. Первый коммит – это рабочая версия, а второй — нерабочая.
Заранее спасибо.
РЕДАКТИРОВАТЬ: я попробовал что-то еще: создать новый Uint8List и перебрать байты из обрезанного изображения, чтобы добавить их в этот список, а затем передать его в Image.memory. Это не сработало, потому что не была запущена даже первая итерация forEach. Странно.

Подробнее здесь: https://stackoverflow.com/questions/785 ... in-flutter
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»