Dart 如何在颤振中裁剪图像?

Dart 如何在颤振中裁剪图像?,dart,flutter,Dart,Flutter,假设我有一个矩形的肖像图像: 我想裁剪它,使其呈现如下: 我怎样才能在弗利特做到这一点 (我不需要调整图像的大小。) (图片来源)看看,它是一个独立于平台的库,用于在Dart中操作图像 您可以使用以下功能: Image copyCrop(Image src, int x, int y, int w, int h); 我可能会用a和a。您可以使用alignment和fit属性来确定图像的裁剪方式。如果不想硬编码容器上的高度,可以使用小部件 您还可以直接将该类与一起使用,并执行以下操作: n

假设我有一个矩形的肖像图像:

我想裁剪它,使其呈现如下:

我怎样才能在弗利特做到这一点

(我不需要调整图像的大小。)

(图片来源)

看看,它是一个独立于平台的库,用于在Dart中操作图像

您可以使用以下功能:

Image copyCrop(Image src, int x, int y, int w, int h);
我可能会用a和a。您可以使用
alignment
fit
属性来确定图像的裁剪方式。如果不想硬编码容器上的高度,可以使用小部件


您还可以直接将该类与一起使用,并执行以下操作:

new Image.asset(
  stringToImageLocation,
  fit: BoxFit.cover,
)

有一个名为
imagecrapper
的新包。我建议每个人都使用它,因为它有很多功能,使一切都更容易。它允许您将图像裁剪为所需的任意或指定的纵横比,甚至可以压缩图像。以下是该软件包的链接:

导入'dart:io';
进口“包装:颤振/材料.省道”;
导入“包:image_picker/image_picker.dart”;
导入“package:image_cropper/image_cropper.dart”;
类MyPage扩展了StatefulWidget{
@凌驾
_MyPageState createState()=>\u MyPageState();
}
类MyPageState扩展了状态{
///变数
文件图像文件;
///小部件
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:颜色(0xFF30777),
标题:文本(“图像裁剪器”),
),
主体:容器(
子项:imageFile==null
?容器(
对齐:对齐.center,
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
升起的按钮(
颜色:颜色(0xFF30777),
已按下:(){
_getFromGallery();
},
子:文本(
“从画廊中挑选”,
样式:TextStyle(颜色:Colors.white),
),
),
],
),
)
:容器(
子:Image.file(
图像文件,
适合:BoxFit.cover,
),
)));
}
///从画廊获得
_getFromGallery()异步{
PickedFile PickedFile=等待ImagePicker().getImage(
来源:ImageSource.gallery,
最大宽度:1800,
最大高度:1800,
);
_cropImage(pickedFile.path);
}
///作物图像
_cropImage(文件路径)异步{
文件裁剪图像=等待图像裁剪器.cropImage(
sourcePath:filePath,
最大宽度:1080,
最大高度:1080,
);
如果(裁剪图像!=null){
图像文件=裁剪图像;
setState((){});
}
}
}

为您的
图像
小部件提供一个
拟合
因子,然后将其包装在
AspectRatio

AspectRatio(
方面:1.5,
子:Image.asset(
“你的形象资产”,
适合:BoxFit.cover,
),
)

谢谢!你用弗利特试过吗?我想知道如何进出brendan的图像库。我不认为Flatter提供了一种从
ui.Image
获取解码图像的简单方法。但是如果您使用brendan的图像库进行解码,您可以调用
image.getBytes()
并将其传递给
新图像。内存
是否可以添加示例,说明如何在网络图像中执行此操作?我试图在特定的
{x:897,y:235,宽度:845,高度:845}
值上裁剪图像,但找不到任何适合我的东西。哇,我有不同的问题,但这个盒子装饰技术适合我。感谢男士:)您正在尝试在渲染文件时对其进行裁剪。但是,我希望存储图像的裁剪版本,然后进行渲染。你知道这样的技术或软件包吗?嗨,我想在两个方向上显示图像的一部分。假设我有1080x1920图像,我想显示(x=100~200,y=300~400)部分。因此,我不能使用这种拟合+对齐方法。我怎样才能做到?谢谢使用
DecorationImage
时,我想在两个方向上显示部分图像。假设我有1080x1920图像,我想显示(x=100~200,y=300~400)部分。因此,我不能使用这种拟合+对齐方法。我怎样才能做到?谢谢如何从该软件包中添加自定义比率?请回答?我在docs或SC中找不到任何内容,您能帮我提供一个代码片段吗?我在ImageCropper的repo中找到了这个:谢谢,@uni,是的,没错,但它只帮助显示一个纵横比,事实上,如果我们使用aspectRatio,它将锁定AspectRatioPreset中的所有列表。
new Image.asset(
  stringToImageLocation,
  fit: BoxFit.cover,
)
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:image_cropper/image_cropper.dart';

class MyPage extends StatefulWidget {
  @override
  _MyPageState createState() => _MyPageState();
}

class _MyPageState extends State<MyPage> {
  /// Variables
  File imageFile;

  /// Widget
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Color(0XFF307777),
          title: Text("Image Cropper"),
        ),
        body: Container(
            child: imageFile == null
                ? Container(
                    alignment: Alignment.center,
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        RaisedButton(
                          color: Color(0XFF307777),
                          onPressed: () {
                            _getFromGallery();
                          },
                          child: Text(
                            "PICK FROM GALLERY",
                            style: TextStyle(color: Colors.white),
                          ),
                        ),
                      ],
                    ),
                  )
                : Container(
                    child: Image.file(
                      imageFile,
                      fit: BoxFit.cover,
                    ),
                  )));
  }

  /// Get from gallery
  _getFromGallery() async {
    PickedFile pickedFile = await ImagePicker().getImage(
      source: ImageSource.gallery,
      maxWidth: 1800,
      maxHeight: 1800,
    );
    _cropImage(pickedFile.path);
  }

  /// Crop Image
  _cropImage(filePath) async {
    File croppedImage = await ImageCropper.cropImage(
      sourcePath: filePath,
      maxWidth: 1080,
      maxHeight: 1080,
    );
    if (croppedImage != null) {
      imageFile = croppedImage;
      setState(() {});
    }
  }
}