C# .NET颜色的RGB格式

C# .NET颜色的RGB格式,c#,colors,C#,Colors,我一直在检查有关颜色的文档(我正在编写一个C#程序) 如果您看到这里,它将根据RGB的8位值设置颜色。换句话说,我想这是RGB-888格式的…我猜 我的相机使用RGB-565格式(R为5位,B为5位,G为6位) 有没有办法将颜色设置为基于此格式而不是888的颜色? 或者我必须自己手动完成这项工作吗?我最近编写了一些代码,基于 答案是关于StackOverflow的另一个问题,虽然这个问题实际上不是重复的,但我认为答案是,所以我将链接到它: 请注意,我不确定每个因子的乘数在5-6-5格式上是如

我一直在检查有关颜色的文档(我正在编写一个C#程序)

如果您看到这里,它将根据RGB的8位值设置颜色。换句话说,我想这是RGB-888格式的…我猜

我的相机使用RGB-565格式(R为5位,B为5位,G为6位) 有没有办法将颜色设置为基于此格式而不是888的颜色?
或者我必须自己手动完成这项工作吗?

我最近编写了一些代码,基于

答案是关于StackOverflow的另一个问题,虽然这个问题实际上不是重复的,但我认为答案是,所以我将链接到它:

请注意,我不确定每个因子的乘数在5-6-5格式上是如何工作的。6位组件是否更精确?在这种情况下,自动转换系统将完成这项工作

无论如何,有了上面链接的代码,这个例子应该完全适合您的需要。此处用于转换自定义5-5-5-1 RGBA格式:

//bytes 84 21 ==> 0x8421 (BE) ==bin==> 1000 0100 0010 0001 ==split==> 10000 10000 10000 1 ==dec==> 16 16 16 1 (RGBA) ==adjust==> 128 128 128 255
// values in constructor are: bytes per pixel, amount of bits and amount to shift for getting R, G, B and A components, and data endianness.
private static PixelFormatter SixteenBppFormatter = new PixelFormatter(2, 5, 11, 5, 6, 5, 1, 1, 0, false);

protected static Byte[] Convert16bTo32b(Byte[] imageData, Int32 startOffset, Int32 width, Int32 height, ref Int32 stride)
{
    Int32 newImageStride = width * 4; ;
    Byte[] newImageData = new Byte[height * newImageStride];
    for (Int32 y = 0; y < height; y++)
    {
        for (Int32 x = 0; x < width; x++)
        {
            Int32 sourceOffset = y * stride + x * 2;
            Int32 targetOffset = y * newImageStride + x * 4;
            Color c = SixteenBppFormatter.GetColor(imageData, startOffset + sourceOffset);
            PixelFormatter.Format32BitArgb.WriteColor(newImageData, targetOffset, c);
        }
    }
    stride = newImageStride;
    return newImageData;
}
请注意,在编辑原始图像字节的所有情况下,“跨步”和“宽度”之间的差异。在许多格式中,图像中的一行像素被填充到四个字节的下一个倍数,因此您不能仅将其作为数组读取和处理,假设它是所有图像数据;那些填充字节会很快把事情搞砸。如我将16bpp格式转换为ARGB的示例代码所示,您确实需要逐行执行该操作,每行确保只使用仍在(宽度*字节/像素)范围内的数据


我注意到,对于所有可能改变步幅的函数,建议将其作为
ref
参数提供。

任何可以用5-6-5格式表示的颜色都可以用8-8-8格式表示。(.NET实际上使用8-8-8-8格式;最后8位用于alpha通道。如果不需要,当然可以忽略它。不透明颜色的alpha通道设置为255。)嗯,关于任何相机的固件都支持将相机图像转换为更合适的格式。一定要小心,不要故意让它变得麻烦。甚至像Bitmap.LockBits()这样的方法也允许您通过指定像素格式进行转换。这不是免费的。将565转换为888需要@CodyGray的位移位是的,这就是我要问的。.NET是包含这种格式的565还是我必须自己转换?@HansPassant噢,我还不懂锁位,但我看了一眼,它与像素格式的565有关。所以.NET毕竟与565有关。。。问题是,我是应该用这种看似复杂的方式,还是只是自己做转换。。。这似乎更简单…您没有解释为什么您更喜欢在16位模式下操作相机。请不要强迫我们猜测哪个更简单,使用24位像素格式要简单得多。
/// <summary>
/// Gets the raw bytes from an image.
/// </summary>
/// <param name="sourceImage">The image to get the bytes from.</param>
/// <param name="stride">Stride of the retrieved image data.</param>
/// <returns>The raw bytes of the image</returns>
public static Byte[] GetImageData(Bitmap sourceImage, out Int32 stride)
{
    BitmapData sourceData = sourceImage.LockBits(new Rectangle(0, 0, sourceImage.Width, sourceImage.Height), ImageLockMode.ReadOnly, sourceImage.PixelFormat);
    stride = sourceData.Stride;
    Byte[] data = new Byte[stride * sourceImage.Height];
    Marshal.Copy(sourceData.Scan0, data, 0, data.Length);
    sourceImage.UnlockBits(sourceData);
    return data;
}