Flutter 如何:旋转选定/设置的图像(颤振)
在从图像选择器(画廊/相机)中选择图像后,我成功地将图像旋转到横向/纵向 这工作正常,并将继续将新图像设置为我所需的方向 但是,我尝试使用相同的方法旋转已选择/设置的图像,但它不起作用 以下是我使用的逻辑:Flutter 如何:旋转选定/设置的图像(颤振),flutter,dart,Flutter,Dart,在从图像选择器(画廊/相机)中选择图像后,我成功地将图像旋转到横向/纵向 这工作正常,并将继续将新图像设置为我所需的方向 但是,我尝试使用相同的方法旋转已选择/设置的图像,但它不起作用 以下是我使用的逻辑: import 'package:image/image.dart' as img; void _rotateImage(File file) async { print('>>> rotating image'); try { List&l
import 'package:image/image.dart' as img;
void _rotateImage(File file) async {
print('>>> rotating image');
try {
List<int> imageBytes = await file.readAsBytes();
final originalImage = img.decodeImage(imageBytes);
print('>>> original width: ${originalImage.width}');
img.Image fixedImage;
fixedImage = img.copyRotate(originalImage, 90);
print('>>> fixed width: ${fixedImage.width}');
final fixedFile = await file.writeAsBytes(img.encodeJpg(fixedImage));
setState(() {
print('>>> setting state');
_image = fixedFile;
});
} catch (e) {
print(e);
}
}
有人知道为什么这种方法在从照相机/多媒体资料中拾取新图像时有效,但在使用已处于状态的文件时却不起作用吗
[编辑]我想这可能与使用的文件路径相同有关。因此,我在下面添加了这段代码,虽然它使图像刷新,但在几分之一秒的时间内,它仍然不会显示旋转后的图像[/EDIT]
import 'package:image/image.dart' as img;
void _rotateImage(File file) async {
try {
Random random = new Random();
int randomNumber = random.nextInt(1000000);
final newFile = await file.copy(
'/data/user/0/!PRIVATE!/cache/rotatedImage$randomNumber.jpg');
List<int> imageBytes = await newFile.readAsBytes();
final originalImage = img.decodeImage(imageBytes);
img.Image fixedImage;
fixedImage = img.copyRotate(originalImage, 90);
final fixedFile = await newFile.writeAsBytes(img.encodeJpg(fixedImage),
mode: FileMode.append, flush: true);
setState(() {
_image = fixedFile;
});
} catch (e) {
print(e);
}
}
import'package:image/image.dart'作为img;
void\u rotateImage(文件)异步{
试一试{
随机=新随机();
int randomNumber=random.nextInt(1000000);
final newFile=wait file.copy(
“/data/user/0/!PRIVATE!/cache/rotateImage$randomNumber.jpg”);
List imageBytes=wait newFile.readAsBytes();
最终原始图像=图像解码图像(图像字节);
图像固定图像;
fixedImage=图像复制旋转(原始图像,90);
final fixedFile=等待newFile.writeAsBytes(img.encodeJpg(fixeImage),
模式:FileMode.append,flush:true);
设置状态(){
_图像=固定文件;
});
}捕获(e){
印刷品(e);
}
}
下面是一些代码,用于显示在选择图像并选择旋转时发生的情况
import 'package:image/image.dart' as img;
void _pickImage() async {
Navigator.pop(context);
try {
final pickedFile =
await _imagePicker.getImage(source: ImageSource.gallery);
File file = File(pickedFile.path);
if (pickedFile != null && _rotateToLandscape) {
await _setImageToLandscape(file);
} else if (pickedFile != null) {
await _setImageToPortrait(file);
}
} catch (e) {
print(e);
}
}
Future<void> _setImageToLandscape(File file) async {
print('>>> setting image to landscape');
try {
setState(() {
_loading = true;
});
var decodedImage = await decodeImageFromList(file.readAsBytesSync());
int width = decodedImage.width;
int height = decodedImage.height;
if (width > height) {
print('>>> returing original image');
_setSelectedImage(file);
} else if (width < height) {
print('>>> rotating image');
List<int> imageBytes = await file.readAsBytes();
final originalImage = img.decodeImage(imageBytes);
img.Image fixedImage;
fixedImage = img.copyRotate(originalImage, -90);
final fixedFile = await file.writeAsBytes(img.encodeJpg(fixedImage));
_setSelectedImage(fixedFile);
}
} catch (e) {
print(e);
} finally {
setState(() {
_loading = false;
});
}
}
void _setSelectedImage(File file) {
switch (_selectedImage) {
case 1:
setState(() {
_image = file;
widget.setImage(image: file);
});
break;
case 2:
setState(() {
_image2 = file;
widget.setImage(image2: file);
});
break;
case 3:
setState(() {
_image3 = file;
widget.setImage(image3: file);
});
break;
}
}
import'package:image/image.dart'作为img;
void\u pickImage()异步{
Navigator.pop(上下文);
试一试{
最终选取的文件=
wait_imagePicker.getImage(源代码:ImageSource.gallery);
File=File(pickedFile.path);
if(pickedFile!=null&&u){
wait_setImageToLandscape(文件);
}else if(pickedFile!=null){
wait_setImageToPortrait(文件);
}
}捕获(e){
印刷品(e);
}
}
Future\u setImageToLandscape(文件)异步{
打印('>>>将图像设置为横向);
试一试{
设置状态(){
_加载=真;
});
var decodedImage=await decodeImageFromList(file.readAsBytesSync());
int-width=decodedImage.width;
int height=decodedImage.height;
如果(宽度>高度){
打印('>>>恢复原始图像');
_设置所选图像(文件);
}否则,如果(宽度<高度){
打印('>>>旋转图像');
List imageBytes=wait file.readAsBytes();
最终原始图像=图像解码图像(图像字节);
图像固定图像;
fixedImage=img.copyRotate(原始图像,-90);
final fixedFile=wait file.writeAsBytes(img.encodeJpg(fixeImage));
_设置选定图像(固定文件);
}
}捕获(e){
印刷品(e);
}最后{
设置状态(){
_加载=假;
});
}
}
void _setSelectedImage(文件){
开关(\u选择图像){
案例1:
设置状态(){
_图像=文件;
setImage(图像:文件);
});
打破
案例2:
设置状态(){
_image2=文件;
setImage(image2:文件);
});
打破
案例3:
设置状态(){
_image3=文件;
setImage(image3:文件);
});
打破
}
}
在写入文件模式时,您已经设置了文件模式。
附加
,因此它将在旧图像之后的同一文件中添加新图像(因为您复制了旧文件),这意味着在解码新图像时,只有第一部分将被解码(原始图像)
因此,要解决这个问题,您应该能够从write中删除
模式
,请问您将哪个包作为“img”导入?我想使用你的代码,我自己…:)这个-。我导入并使用(导入'package:image/image.dart'作为img;)
import 'package:image/image.dart' as img;
void _pickImage() async {
Navigator.pop(context);
try {
final pickedFile =
await _imagePicker.getImage(source: ImageSource.gallery);
File file = File(pickedFile.path);
if (pickedFile != null && _rotateToLandscape) {
await _setImageToLandscape(file);
} else if (pickedFile != null) {
await _setImageToPortrait(file);
}
} catch (e) {
print(e);
}
}
Future<void> _setImageToLandscape(File file) async {
print('>>> setting image to landscape');
try {
setState(() {
_loading = true;
});
var decodedImage = await decodeImageFromList(file.readAsBytesSync());
int width = decodedImage.width;
int height = decodedImage.height;
if (width > height) {
print('>>> returing original image');
_setSelectedImage(file);
} else if (width < height) {
print('>>> rotating image');
List<int> imageBytes = await file.readAsBytes();
final originalImage = img.decodeImage(imageBytes);
img.Image fixedImage;
fixedImage = img.copyRotate(originalImage, -90);
final fixedFile = await file.writeAsBytes(img.encodeJpg(fixedImage));
_setSelectedImage(fixedFile);
}
} catch (e) {
print(e);
} finally {
setState(() {
_loading = false;
});
}
}
void _setSelectedImage(File file) {
switch (_selectedImage) {
case 1:
setState(() {
_image = file;
widget.setImage(image: file);
});
break;
case 2:
setState(() {
_image2 = file;
widget.setImage(image2: file);
});
break;
case 3:
setState(() {
_image3 = file;
widget.setImage(image3: file);
});
break;
}
}