WPF 中的 10/11/12 位编码像素
10/11/12 bit coded pixels in WPF
我需要使用单色相机 API,其手册中说明如下:
Each pixel (10, 11 or 12 bits) is coded on 16 bits. Pixel value is
placed on the LSB of the 16 bits.
我将 WPF/C# 与位图一起使用;或者我可以将 WPF 与 OpenGL 一起使用。我没有任何专业知识。
只有这样才能将像素向下转换为 8 位吗?(here 有人提到)
我遇到了最接近的问题 here 但没有答案。
您可以使用将 Format
设置为 PixelFormats.Gray16
的 BitmapSource。
然后像这样将源像素值转换为 16 位像素值:
public static int ConvertTo16Bit(int pixelValue, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
return maxTargetValue * pixelValue / maxSourceValue;
}
像这样转换像素缓冲区数组:
public static void ConverTo16Bit(
ushort[] target, ushort[] source, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
for (int i = 0; i < source.Length; i++)
{
target[i] = (ushort)(maxTargetValue * source[i] / maxSourceValue);
}
}
或者当你想创建一个新的目标像素缓冲区时,像这样:
public static ushort[] ConverTo16Bit(ushort[] source, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
return source
.Select(value => (ushort)(maxTargetValue * value / maxSourceValue))
.ToArray();
}
我需要使用单色相机 API,其手册中说明如下:
Each pixel (10, 11 or 12 bits) is coded on 16 bits. Pixel value is placed on the LSB of the 16 bits.
我将 WPF/C# 与位图一起使用;或者我可以将 WPF 与 OpenGL 一起使用。我没有任何专业知识。
只有这样才能将像素向下转换为 8 位吗?(here 有人提到)
我遇到了最接近的问题 here 但没有答案。
您可以使用将 Format
设置为 PixelFormats.Gray16
的 BitmapSource。
然后像这样将源像素值转换为 16 位像素值:
public static int ConvertTo16Bit(int pixelValue, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
return maxTargetValue * pixelValue / maxSourceValue;
}
像这样转换像素缓冲区数组:
public static void ConverTo16Bit(
ushort[] target, ushort[] source, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
for (int i = 0; i < source.Length; i++)
{
target[i] = (ushort)(maxTargetValue * source[i] / maxSourceValue);
}
}
或者当你想创建一个新的目标像素缓冲区时,像这样:
public static ushort[] ConverTo16Bit(ushort[] source, int sourceBitsPerPixel)
{
const int maxTargetValue = (1 << 16) - 1;
int maxSourceValue = (1 << sourceBitsPerPixel) - 1;
return source
.Select(value => (ushort)(maxTargetValue * value / maxSourceValue))
.ToArray();
}