在 Flutter 中 drawImage 或 paintImage 都不能正常工作

Posted

技术标签:

【中文标题】在 Flutter 中 drawImage 或 paintImage 都不能正常工作【英文标题】:Either drawImage or paintImage doesn't work properly in Flutter 【发布时间】:2019-02-22 18:44:48 【问题描述】:

我基本上想在画布上显示我在资产文件夹中的图像。

    import 'package:flutter/material.dart' as ui;

    ...

    ui.Image img = ui.Image.asset("images/some_image.png");
    ui.paintImage(canvas: canvas, image: img);

当我尝试将 img 分配给 paintImage 的图像时收到以下错误消息。

参数类型'Image (C:\ABC\flutter\packages\flutter\lib\src\widgets\image.dart)'不能分配给参数类型'Image (C:\ABC\flutter\ bin\cache\pkg\sky_engine\lib\ui\painting.dart)'。

我真的不知道会出什么问题,我见过其他代码与 ui.Image 有类似的方法。

请指教。

【问题讨论】:

【参考方案1】:

flutter 中有两个名为Image 的类,在不同的包中。

Widget,其行为类似于小部件,可以通过其命名构造函数从资产、内存或网络中实例化。

还有 ui 包Image 用于在较低级别绘制时使用,例如在CustomPainter 中。由于此版本位于 ui 包中,因此通常使用 ui 前缀导入,如下所示:

import 'dart:ui' as ui;

不要将material 导入为ui!这会导致很多混乱。

要制作小部件,请使用 Image.asset 构造函数,并传递资产名称。

要从资产中创建ui.Image,请使用此 sn-p:

  Future<ui.Image> load(String asset) async 
    ByteData data = await rootBundle.load(asset);
    ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
    ui.FrameInfo fi = await codec.getNextFrame();
    return fi.image;
  

【讨论】:

啊,我明白了。谢谢 我现在遇到了这个答案并且遇到了一个非常相似的问题。我的图像是 base64Encoded 字符串,所以我尝试执行以下操作: void paint(Canvas canvas, Size size) async canvas.drawImage(await load(image), Offset(0.0, 0.0), Paint()); ... Future load(String image) async Uint8List bytes = base64Decode(image); ui.Codec 编解码器 = 等待 ui.instantiateImageCodec(bytes); // ui.Codec 编解码器 = 等待 ui.instantiateImageCodec(data.buffer.asUint8List()); ui.FrameInfo fi = 等待 codec.getNextFrame();返回fi.image; *并得到无法加载错误 最好提出一个新问题。 @Damandroid 你得到上面查询的解决方案了吗? 没有@princeoo7。现在它被搁置了。

以上是关于在 Flutter 中 drawImage 或 paintImage 都不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

JAVA的drawImage方法

GDI+ DrawImage 在 C++ (Win32) 中比在 C# (WinForms) 中慢得多

java中applet中的drawimage怎么用

canvas中的drawImage

微信小程序 base64 图片 canvas 画布 drawImage 实现

在java中方法drawImage()的参数详细解释