В качестве примера предположим, что у меня есть 8-битное изображение в оттенках серого. то есть каждый пиксель представляет собой байт в диапазоне 0-255. И теперь я хочу преобразовать это в предварительно умноженное альфа-изображение с указанным цветом. Таким образом, входные данные представляют собой 8-битный массив (8 бит на пиксель), а выходные данные — 32-битный массив (32 бита на пиксель RGBA_8888).
Таким образом, массивы не являются один к одному. Один байт в массиве оттенков серого будет преобразован в 4 байта в массиве цветов.
В скалярной форме это будет выглядеть так:
Код: Выделить всё
public class Test
{
const int ImageSize = 2048;
const int ImageLength = ImageSize * ImageSize;
private byte[] _bytesGray = new byte[ImageLength];
private uint[] _pixelsRGBA = new uint[ImageLength];
private const byte _colorR = 0xFF;
private const byte _colorG = 0x01;
private const byte _colorB = 0x02;
private const byte _colorA = 0xFF;
[GlobalSetup]
public void Setup()
{
for (int i = 0; i < ImageLength; i++)
{
_bytesGray[i] = (byte)(i + 1);
_pixelsRGBA[i] = 0;
}
}
[Benchmark]
public unsafe void GrayscaleToColor_Scalar()
{
fixed (byte* bytePtr = _bytesGray)
fixed (uint* pixelPtr = _pixelsRGBA)
{
for (int i = 0; i < ImageLength; ++i)
{
byte value = bytePtr[i];
byte r = (byte)((value * _colorR) >> 8);
byte g = (byte)((value * _colorG) >> 8);
byte b = (byte)((value * _colorB) >> 8);
byte a = (byte)((value * _colorA) >> 8);
pixelPtr[i] = (uint)(r
Подробнее здесь: [url]https://stackoverflow.com/questions/78746532/avx2-consuming-bytes-whilst-producing-uints[/url]
Мобильная версия