Я знаю, что это примерно на миллион лет позже, но в случае, как и я, вы сталкиваетесь с этой проблемой в любой момент времени, вот что я сделал, чтобы исправить ее после некоторого исследования.
Решение дляэто открыть исходный код для квантователя, чтобы посмотреть на квантование, а в разделе, который назначает байты от объекта-указателя на байтовый массив, вы можете просто поменять местами первый и третий байты (байты для красного и синего значений), и этодолжен исправить это.
Но так как я здесь, я могу также поделиться другой вещью, которую я сделал, которая резко ускоряет квантование с помощью Marshal.Copy для копирования байтов из указателя в массив байтов.Я не знаю, есть ли какие-либо недостатки в этом деле или ситуация, когда это нежелательно, поэтому, если кто-то знает иначе, я бы хотел это услышать.
Так что просто измените
BitmapData bitmapdata = image.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
byte* numPtr = (byte*)bitmapdata.Scan0.ToPointer();
int index = 0;
byte[] buffer = new byte[(source.Width * source.Height) * 4];
for(int i = 0; i < source.Width; i++) {
for(int j = 0; j < source.Height; j++) {
buffer[index] = numPtr[index];
index++;
buffer[index] = numPtr[index];
index++;
buffer[index] = numPtr[index];
index++;
buffer[index] = numPtr[index];
index++;
}
}
image.UnlockBits(bitmapdata);
return buffer;
до
BitmapData bitmapdata = copy.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
byte[] bytes = new byte[source.Width * source.Height * 4];
//copy the bytes from the Scan0 pointer to our byte array
Marshal.Copy(bitmapdata.Scan0, bytes, 0, bytes.Length);
//swap the red and blue bytes
for(int a = 0; a < bytes.Length; a += 4) {
byte tmp = bytes[a];
bytes[a] = bytes[a + 2];
bytes[a + 2] = tmp;
}
copy.UnlockBits(bitmapdata);
return bytes;
Это решение прекрасно работает и работает быстрее, чем исходный код, что важно, если вы пытаетесь использовать его в реальном времени, как я.Чтобы еще больше ускорить его, я удалил бит, в котором оно перерисовало изображение, в отдельное растровое изображение, потому что я не знаю, почему он сделал это с самого начала, и я не видел в этом необходимости, но могу ошибаться.
Также я не знаю, есть ли более быстрый способ поменять красные и синие байты, я хотел бы услышать, есть ли лучший способ сделать это тоже.Если кто-нибудь когда-нибудь и прочитает это ...