Flutter——最详细的Image(图像)使用教程

Image简介

用于显示一张图片,可以从文件、内存、网络、资源。可以指定适应方式、样式、颜色混合模式、重复模式等。

常用属性

属性作用
fit图片的适应模式
alignment图片的对齐模式

获取资源文件和网络图片

class ImageWidget extends StatelessWidget {
  final assetsImagePath = "assets/images/flutter_mark_logo.png";
  final netImageUrl =
      "https://flutterchina.club/images/homepage/header-illustration.png";

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        _loadFromAssets(),
        _loadFromNet(),
      ],
    );
  }

  Widget _loadFromAssets() => Wrap(
        spacing: 10,
        children: <Widget>[
          Image.asset(assetsImagePath, height: 80, width: 80),
        ],
      );

  Widget _loadFromNet() => Image.network(netImageUrl, height: 80);
}

在这里插入图片描述

属性:fit:BoxFit.values

class FitImage extends StatefulWidget {
  @override
  _FitImageState createState() => _FitImageState();
}

class _FitImageState extends State<FitImage> {
  @override
  Widget build(BuildContext context) {
    var imageLi = BoxFit.values
        .toList()
        .map((mode) => Column(children: <Widget>[
              Container(
                  margin: EdgeInsets.all(5),
                  width: 100,
                  height: 80,
                  color: Colors.grey.withAlpha(88),
                  child: Image(
                      image: AssetImage("assets/images/avaver.jpeg"),
                      fit: mode)),
              Text(mode.toString().split(".")[1])
            ]))
        .toList();

    return Wrap(
      children: [...imageLi],
    );
  }
}

在这里插入图片描述

属性:Alignment


class AlignmentImage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var alignment = [
      Alignment.center,
      Alignment.centerLeft,
      Alignment.centerRight,
      Alignment.topCenter,
      Alignment.topLeft,
      Alignment.topRight,
      Alignment.bottomCenter,
      Alignment.bottomLeft,
      Alignment.bottomRight
    ]; //测试数组
    var imgLi = alignment
        .map((alignment) => //生成子Widget列表
            Column(children: <Widget>[
              Container(
                  margin: EdgeInsets.all(5),
                  width: 90,
                  height: 60,
                  color: Colors.grey.withAlpha(88),
                  child: Image(
                    image: AssetImage("assets/images/avaver.jpeg"),
                    alignment: alignment,
                  )),
              Text(alignment.toString())
            ]))
        .toList();
    var imageAlignment = Wrap(children: imgLi);
    return imageAlignment;
  }
}

在这里插入图片描述

图片重复模式

class RepeatImage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Wrap(
      children: ImageRepeat.values
          .toList()
          .map((mode) => Column(children: <Widget>[
                Container(
                    margin: EdgeInsets.all(5),
                    width: 150,
                    height: 60,
                    color: Colors.red,
                    child: Image(
                        image: AssetImage("assets/images/avaver.jpeg"),
                        repeat: mode)),
                Text(mode.toString().split(".")[1])
              ]))
          .toList(),
    );
  }
}

在这里插入图片描述

要将 CameraImage 转换为 Flutter 中用于显示的图像,需要使用 ImageConverter 将其转换为 Uint8List,并使用 decodeImage 将其解码为 Image。以下是一个示例代码片段,展示了如何使用 decodeImage 操作 CameraImage: ```dart import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:camera/camera.dart'; import 'package:image/image.dart' as Img; class CameraPreviewWidget extends StatelessWidget { final CameraImage image; const CameraPreviewWidget({ Key key, @required this.image, }) : super(key: key); @override Widget build(BuildContext context) { final Image img = Image.memory( Uint8List.view( image.planes[0].bytes.buffer, image.planes[0].bytes.offsetInBytes, image.planes[0].bytes.length, ), ); return img; } Future<Img.Image> convertCameraImage(CameraImage image) async { final int width = image.width; final int height = image.height; final Uint8List bytes = _concatenatePlanes(image.planes); return Img.decodeImage(bytes); } Uint8List _concatenatePlanes(List<Plane> planes) { final Completer<List<Uint8List>> completer = Completer<List<Uint8List>>(); final List<Uint8List> bytesList = <Uint8List>[]; int bytes = 0; for (int i = 0; i < planes.length; i++) { bytes += planes[i].bytes.length; bytesList.add(planes[i].bytes); } final Uint8List concatenatedBytes = Uint8List(bytes); int index = 0; for (int i = 0; i < planes.length; i++) { concatenatedBytes.setRange(index, index + planes[i].bytes.length, planes[i].bytes); index += planes[i].bytes.length; } return concatenatedBytes; } } ``` 在这个示例中,我们首先使用一个 Uint8List.view 将 CameraImage 中的字节拼接在一起,然后使用 decodeImage 将其解码为 Image。注意,在上面的代码中,我们使用了一个名为 _concatenatePlanes 的辅助函数,将不同平面的字节拼接在一起。 希望这可以帮助你解决问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怀君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值