У меня есть плата датчика изображения для встроенной разработки, для которой мне нужно захватить поток изображений и вывести их в 8-битном моно chrome / оттенках серого. Выходной сигнал тепловизора 12-битный моно chrome (который занимает 2 байта на пиксель).
В коде у меня есть IntPtr
в буфер памяти, который содержит данные 12-битного изображения, от который я должен извлечь и преобразовать эти данные в 8-битное изображение. В памяти это выглядит примерно так (при ярком свете, активирующем пиксели):
Как видите, каждый второй байт содержит младший бит что я хочу отбросить, сохраняя тем самым только нечетные байты (иначе говоря). Лучшее решение, которое я могу придумать, - это перебирать память, но в этом-то и проблема. Я не могу заставить это работать. Мне нужна помощь с алгоритмом в C#, чтобы сделать это.
Вот пример изображения, которое представляет прямое создание Bitmap
объекта из IntPtr
следующим образом:
bitmap = new Bitmap(imageWidth, imageHeight, imageWidth, PixelFormat.Format8bppIndexed, pImage);
// Failed Attempt #1
unsafe
{
IntPtr pImage; // pointer to buffer containing 12-bit image data from imager
int i = 0, imageSize = (imageWidth * imageHeight * 2); // two bytes per pixel
byte[] imageData = new byte[imageSize];
do
{
// Should I bitwise shift?
imageData[i] = (byte)(pImage + i) << 8; // Doesn't compile, need help here!
} while (i++ < imageSize);
}
// Failed Attempt #2
IntPtr pImage; // pointer to buffer containing 12-bit image data from imager
imageSize = imageWidth * imageHeight;
byte[] imageData = new byte[imageSize];
Marshal.Copy(pImage, imageData, 0, imageSize);
// I tried with and without this loop. Neither gives me images.
for (int i = 0; i < imageData.Length; i++)
{
if (0 == i % 2) imageData[i / 2] = imageData[i];
}
Bitmap bitmap;
using (var ms = new MemoryStream(imageData))
{
bitmap = new Bitmap(ms);
}
// This also introduced a memory leak somewhere.
В качестве альтернативы, если есть способ сделать это с Bitmap
, byte[]
, MemoryStream
, et c. это работает, у меня все уши, но все, что я пробовал, провалилось.