gpt4 book ai didi

dart - 字节数据的操作速度较慢

转载 作者:IT王子 更新时间:2023-10-29 06:40:37 26 4
gpt4 key购买 nike

我正在尝试使用此函数获取一系列不同偏移量的像素颜色,

   _getColor(ByteData rgbaImageData, int x, int y) {
var byteOffset = x * 4 + y * imageWidth * 4;
var r = rgbaImageData.getUint8(byteOffset);
var g = rgbaImageData.getUint8(byteOffset + 1);
var b = rgbaImageData.getUint8(byteOffset + 2);
var a = rgbaImageData.getUint8(byteOffset + 3);
return Color.fromARGB(a, r, g, b);

但是执行时间很长,有什么解决办法吗?

最佳答案

它不应该那么慢,但你可以减少读取次数:

Color getColor(ByteData rgbaData, int x, int y) {
var byteOffset = (x + y * imageWidth) * 4;
var rgba = rgbaImageData.getUint32(byteOffset);
return Color(argb);
}

对每种颜色只执行一次(可能未对齐)读取,并且不必重新组合字节。

或者,您可以将键入数据的类型更改为 Uint8List:

  var bytes = Uint8List.view(
rgbaImageData.buffer, rgbaImageData.offsetInBytes, rgbaImageData.lengthInBytes);
...
var color = _getColor(bytes, x, y);
...
Color _getColor(Uint8List bytes, int x, int y) {
var byteOffset = (x + y * imageWith) * 4;
var r = bytes[byteOffset];
var g = bytes[byteOffset + 1];
var b = bytes[byteOffset + 2];
var a = bytes[byteOffset + 3];
return Color.fromARGB(a, r, g, b);
}

这可能比原来的更有效,但可能不会很多。

您甚至可以将原始缓冲区解释为 Uint32List,但这仅在 offsetInBytes 是四的倍数时才有效,因为 Uint32List要求数据是 32 位对齐的(这也是为什么它可能比 ByteData 更有效)。如果 offsetInBytes 始终为零,那么这也适用于您。示例:

  var words = Uint32List.view(
rgbaImageData.buffer,
rgbaImageData.offsetInBytes,
rgbaImageData.lengthInBytes ~/ Uint32List.bytesPerElement);
...
var color = _getColor(words, x, y);
...
Color _getColor(Uint32List words, int x, int y) {
var offset = x + y * imageWith;
return Color(words[offset]);
}

这可能很慢的另一个原因是,如果遍历整个图像,您将分配很多 Color 对象。如果图像没有那么多不同的颜色,您可以选择重新使用现有的颜色对象。如果图像有很多不同的颜色,缓存它们可能只会导致更多的内存流失。示例:

Map<int, Color> _colorCache = {};
const int _maxCacheSize = 1024;
Color createColor(int argb) {
var result = _colorCache[argb];
if (result != null) return result;
result = Color(argb);
if (_colorCache.length == _maxCacheSize) {
_colorCache.remove(_colorCache.keys.first);
}
_colorCache[argb] = result;
return result;
}

然后使用 createColor(argb) 而不是 Color(argb)。同样,如果您的图像有很多不同的颜色,并且没有大块相同颜色的色 block ,那么这很可能只是开销。

关于dart - 字节数据的操作速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52159060/

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