gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:46:45 25 4
gpt4 key购买 nike

我可以从内存或文件中设置标准 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com