image - 如何使用 ui.Image 作为 ImageProvider 数据源

标签 image flutter dart photoviewer

我可以从内存或文件中设置标准 flutter 图像,但不能根据 PhotoView 框架的要求设置 ImageProvider。

PhotoView 框架接受 AssetImage 作为提供程序类型,但不接受任何其他 ImageProvider 类型(文件和内存)。

什么可能是解决方法?我认为该框架将支持来自项目 Assets 以外的图像源

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:photo_view/photo_view.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';

import 'dart:ui' as ui;
import 'dart:typed_data';
import 'dart:async';
import 'dart:io';


class TestImageDraw extends StatefulWidget {
  TestImageDraw({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _TestImageDrawState createState() => _TestImageDrawState();
}

class _TestImageDrawState extends State<TestImageDraw> {
  ImageProvider _imageProvider;

  @override
  void initState() {
    super.initState();

    _imageProvider = NetworkImage(
        "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png");
  }

  _generateImage() {
    GenImage.generateImage().then((generatedImage) async {
      ByteData image =
          await generatedImage.toByteData(format: ui.ImageByteFormat.png);

      // String base64 = base64Encode(image.buffer.asInt64List());
      // print(base64);
      // Uint8List bytes = base64Decode(base64);
      // _imageProvider = MemoryImage(bytes);

      _imageProvider = MemoryImage(image.buffer.asUint8List());

      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: Container(
          child: Column(children: <Widget>[
        //Image will display
        Image(image: _imageProvider),
        Container(
            child: _imageProvider != null
                ? PhotoView(imageProvider: _imageProvider)
                : Container()),
      ])),
      floatingActionButton: new FloatingActionButton(
        onPressed: _generateImage,
        tooltip: 'Generate',
        child: new Icon(Icons.add),
      ),
    );
  }
}

class GenImage {
  static Future<ui.Image> generateImage() async {
    ui.PictureRecorder recorder = new ui.PictureRecorder();
    Canvas c = new Canvas(recorder);
    var rect = new Rect.fromLTWH(0.0, 0.0, 200.0, 200.0);
    c.clipRect(rect);

    final paint = new Paint();
    paint.strokeWidth = 1;
    paint.color = const Color(0xFF0000FF);
    paint.style = PaintingStyle.stroke;

    final offset = new Offset(100.0, 100.0);
    c.drawCircle(offset, 50.0, paint);
    var picture = recorder.endRecording();
    final image = await picture.toImage(500, 500);
    return image;
  }
}

最佳答案

PhotoView 作者在这里,该小部件适用于所有 ImageProvider(内存和文件扩展 ImageProvider)。

问题在于您如何创建提供程序。 image.buffer.asUint8List()打印一个 headless 的位图,使其无法显示。
位图的头部包含诸如每个像素的大小(以位为单位)和图像的大小(以像素为单位)等信息。
我实际上已经围绕它创建了一个完整的包。

bitmap package ,您可以从 ui.Image 中检索有头文件实例:

首先,创建一个位图实例:

ByteData bytedata = await image.toByteData();
Bitmap bitmap = Bitmap.fromHeadless(imageWidth, imageHeight, bytedata.buffer.asUint8List());

然后,恢复位的最终映射:
Uint8List headedIntList = bitmap.buildHeaded();

现在你可以将它传递给 PhotoView:
PhotoView(imageProvider: headedIntList)

关于image - 如何使用 ui.Image 作为 ImageProvider 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59043936/

相关文章:

c# - 确定文件是否为有效的图像格式

javascript - 引用错误 : Image is not defined

firebase - 如何在 flutter 中解决 "RangeError (index): Invalid value : Valid value range is empty : 0"?

flutter | Dart : Target of URI does not exist

flutter - 如何在 flutter 中访问父窗口小部件的数据?

iOS- objective-C : Image manipulation and processing

python - 旋转图像不起作用

flutter - Flutter:使用Switch语句未更改颜色

firebase - 如何将 Firestore 中的 map 数组转换为 map Dart 列表

sockets - Flutter/Dart套接字通信,字符编码问题