RGB 16 位精灵(C# 按位)
RGB 16Bit Sprites (C# Bitwise)
我们正在改装旧的 16 位时代视频游戏卡带。我们希望在游戏中注入一些我们自己的 Sprites 来试一试。
为此,我们正在开发一个应用程序来显示 Sprites 并将新的 Sprites 转换为 Hex(以便于注入。)
游戏将单个像素存储为 2 位十六进制值 (0x0~0xFFFF)。游戏使用位移来建立单独的红色、绿色和蓝色。我们不得不从 Sprite Resources 社区返回一些旧文档来确认这一点。这确认使用了两个口罩。
我们的显示功能运行良好。该函数接收 HEX,然后 returns 具有 3 个值的 ARRAY:R、G、B。
在我们小组中,没有特别擅长按位移位的人。我们正在寻求帮助,将 3 种“int”颜色变回原来的单一 2 位十六进制。
已回答!!谢谢
首先,您确定要在计算中使用 ~
吗:
colorRGB0R = ~(((HexPixelValue >> 11) & PixelMask1) << 3);
colorRGB0G = ~(((HexPixelValue >> 5) & PixelMask2) << 2);
colorRGB0B = ~((HexPixelValue & PixelMask1) << 3);
因为除此之外数学看起来还不错?也许评论部分对这些值做了一些事情,但我不太确定你为什么要反转它们。无论如何...
基本上,您正在使用 565 16 位颜色。如果你像这样编写 16 位值的位布局,而不是那个位掩码,它会更容易理解:rrrrrggg gggbbbbb
因为它可视化你想用什么值设置哪些位。
表示红色和蓝色是 5 位值 (0-31),绿色是 6 位值 (0-63)。但是,由于颜色值应该在 0-255 的范围内,因此在提取位后,您必须将它们相乘以获得范围。这里的乘法也是通过位移来完成的。
要重建 16 位值,您可以这样做:
int ToHex(int red, int green, int blue)
{
if (red < 0 || red >= 256)
throw new ArgumentOutOfRangeException(nameof(red));
if (green < 0 || green >= 256)
throw new ArgumentOutOfRangeException(nameof(green));
if (blue < 0 || blue >= 256)
throw new ArgumentOutOfRangeException(nameof(blue));
// red & 0xF8 cuts off the bottom 3 bits to be save
// green & 0xFC cuts off the bottom 2 bits
// blue needs to be shifted to the right anyway, so we use that to cut off 3 bits
return ((red & 0xF8) << 8) |
((green & 0xFC) << 3) |
(blue >> 3);
}
我们正在改装旧的 16 位时代视频游戏卡带。我们希望在游戏中注入一些我们自己的 Sprites 来试一试。
为此,我们正在开发一个应用程序来显示 Sprites 并将新的 Sprites 转换为 Hex(以便于注入。)
游戏将单个像素存储为 2 位十六进制值 (0x0~0xFFFF)。游戏使用位移来建立单独的红色、绿色和蓝色。我们不得不从 Sprite Resources 社区返回一些旧文档来确认这一点。这确认使用了两个口罩。
我们的显示功能运行良好。该函数接收 HEX,然后 returns 具有 3 个值的 ARRAY:R、G、B。
在我们小组中,没有特别擅长按位移位的人。我们正在寻求帮助,将 3 种“int”颜色变回原来的单一 2 位十六进制。
已回答!!谢谢
首先,您确定要在计算中使用 ~
吗:
colorRGB0R = ~(((HexPixelValue >> 11) & PixelMask1) << 3);
colorRGB0G = ~(((HexPixelValue >> 5) & PixelMask2) << 2);
colorRGB0B = ~((HexPixelValue & PixelMask1) << 3);
因为除此之外数学看起来还不错?也许评论部分对这些值做了一些事情,但我不太确定你为什么要反转它们。无论如何...
基本上,您正在使用 565 16 位颜色。如果你像这样编写 16 位值的位布局,而不是那个位掩码,它会更容易理解:rrrrrggg gggbbbbb
因为它可视化你想用什么值设置哪些位。
表示红色和蓝色是 5 位值 (0-31),绿色是 6 位值 (0-63)。但是,由于颜色值应该在 0-255 的范围内,因此在提取位后,您必须将它们相乘以获得范围。这里的乘法也是通过位移来完成的。
要重建 16 位值,您可以这样做:
int ToHex(int red, int green, int blue)
{
if (red < 0 || red >= 256)
throw new ArgumentOutOfRangeException(nameof(red));
if (green < 0 || green >= 256)
throw new ArgumentOutOfRangeException(nameof(green));
if (blue < 0 || blue >= 256)
throw new ArgumentOutOfRangeException(nameof(blue));
// red & 0xF8 cuts off the bottom 3 bits to be save
// green & 0xFC cuts off the bottom 2 bits
// blue needs to be shifted to the right anyway, so we use that to cut off 3 bits
return ((red & 0xF8) << 8) |
((green & 0xFC) << 3) |
(blue >> 3);
}