Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何:旋转选定/设置的图像(颤振)_Flutter_Dart - Fatal编程技术网

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;
    }
  }