开发者社区 问答 正文

来自字节数组抖动的图像

不久前,我有一个用于Android的代码来转换一个字节数组[0,127,62,28,28,8,0,112,14,9..]其中每个字节为8个像素(例如62->00111110,其中1为黑色像素,0为白色像素)为位图。

                Bitmap bmp = Bitmap.createBitmap(128, 64, Bitmap.Config.ARGB_8888);
                int pixel = 0;
                for (int i = 0; i < byte_display.length; i++) {

                    for (int j = 0; j < 8; j++) {

                        int x = i % bmp.getWidth();
                        int y = i / bmp.getWidth() * 8 + j;
                        pixel = getBit(byte_display[i], j);
                        //System.out.println("BIT=" + pixel + "   " + "X=" + x + "    " + "Y=" + y + "      " + "I=" + i);
                        if (pixel == 1) {
                            bmp.setPixel(x, y, Color.BLACK);
                        } else {
                            bmp.setPixel(x, y, Color.WHITE);
                        }
                    }
                }


                image_Display.setImageBitmap(bmp);

现在我想把这个代码转换成颤振。有谁可以帮我?

谢谢!

展开
收起
游客5akardh5cojhg 2019-12-23 18:23:52 706 分享 版权
阿里云 AI 助理回答

在Flutter中,你不能直接使用Android的Bitmap类来处理位图数据,但你可以使用dart:ui库中的ImagePictureRecorder等类来实现类似的功能。对于你的需求,将字节数组转换为图像,可以考虑使用Image.memory结合ByteData来处理。以下是一个基于Flutter的基本示例,展示如何将一个字节数组转换为图像:

首先,确保你已经导入了必要的库:

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

然后,你可以创建一个函数来生成Uint8List(这是Flutter中用于表示字节数组的数据类型)并将其转换为Image对象:

Future<Image> bytesToImage(List<int> byteData, int width, int height) async {
  // 确保字节数组长度与宽度、高度匹配
  assert(byteData.length == width * height);

  // 创建Uint8List
  Uint8List pixels = Uint8List.fromList(byteData);

  // 将字节数据转换为Image
  ui.Image image = await decodeImage(pixels.buffer.asUint8List(), width: width, height: height);

  return image;
}

接下来,在你的Widget中使用这个函数来显示图像:

class ByteArrayToImage extends StatefulWidget {
  @override
  _ByteArrayToImageState createState() => _ByteArrayToImageState();
}

class _ByteArrayToImageState extends State<ByteArrayToImage> {
  Image? _image;

  @override
  void initState() {
    super.initState();
    // 假设你有一个字节数组,例如:[0, 127, 62, ...]
    List<int> byteArray = [0, 127, 62, 28, 28, 8, 0, 112, 14, 9 /*...*/];
    int width = 128; // 根据实际情况设置宽度
    int height = 64; // 根据实际情况设置高度

    bytesToImage(byteArray, width, height).then((img) {
      setState(() {
        _image = img;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('ByteArray to Image')),
      body: Center(
        child: _image != null ? CustomPaint(painter: ImagePainter(_image!)) : CircularProgressIndicator(),
      ),
    );
  }
}

class ImagePainter extends CustomPainter {
  final ui.Image image;

  ImagePainter(this.image);

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawImage(image, Offset.zero, Paint());
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) => false;
}

这段代码首先定义了一个异步函数bytesToImage,它接收一个字节数组、宽度和高度作为参数,然后使用Flutter的decodeImage方法将这些数据转换成一个Image对象。之后,在_ByteArrayToImageState中初始化状态时调用此函数,并将结果存储在_image变量中,最后通过CustomPaint和自定义的ImagePainter来显示这个图像。

请注意,你需要根据实际的字节数组内容、期望的图像尺寸以及像素排列逻辑调整上述代码。此外,由于Flutter的图像处理API可能在不同版本中有变化,建议查阅最新的Flutter文档以获取最准确的信息。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: