Отображение в том виде, в котором оно было снято, работает:
Код: Выделить всё
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)
Я также где-то читал, что это связано с проблемой эмулятора. Однако я тестировал на реальном устройстве, и произошло то же самое.
Пожалуйста, помогите мне узнать, что нужно, чтобы это работало.
Вот репо с MWE. Первый коммит – это рабочая версия, а второй — нерабочая.
Заранее спасибо.
РЕДАКТИРОВАТЬ: я попробовал что-то еще: создать новый Uint8List и перебрать байты из обрезанного изображения, чтобы добавить их в этот список, а затем передать его в Image.memory. Это не сработало, потому что не была запущена даже первая итерация forEach. Странно.
Подробнее здесь: https://stackoverflow.com/questions/785 ... in-flutter
Мобильная версия