我正在尝试更改此程序其项目编辑器,以显示大小为 32x32px 的精灵 我想从 32x32px 交换到 64px x 64px
我有这样的东西
来源:
public const byte DefaultSize = 32;
public const ushort RGBPixelsDataSize = 3072; // 32*32*3
public const ushort ARGBPixelsDataSize = 4096; // 32*32*4
我改为
public const byte DefaultSize = 64;
public const ushort RGBPixelsDataSize = 12288; // 64*64*3
public const ushort ARGBPixelsDataSize = 16384; // 64*64*4
下一个
我有 32 版本
来源:
for (int y = 0; y < Sprite.DefaultSize; ++y)
{
for (int x = 0; x < Sprite.DefaultSize; ++x)
{
rgbaData[128 * y + x * 4 + 0] = rgbData[(32 - y - 1) * 96 + x * 3 + 2]; // blue
rgbaData[128 * y + x * 4 + 1] = rgbData[(32 - y - 1) * 96 + x * 3 + 1]; // green
rgbaData[128 * y + x * 4 + 2] = rgbData[(32 - y - 1) * 96 + x * 3 + 0]; // red
rgbaData[128 * y + x * 4 + 3] = 0;
}
}
所以我现在有问题:
我应该改为?
我不知道如何计算
for (int y = 0; y < Sprite.DefaultSize; ++y)
{
for (int x = 0; x < Sprite.DefaultSize; ++x)
{
rgbaData[256 * y + x * 4 + 0] = rgbData[(64 - y - 1) * 192 + x * 3 + 2]; // blue
rgbaData[256 * y + x * 4 + 1] = rgbData[(64 - y - 1) * 192 + x * 3 + 1]; // green
rgbaData[256 * y + x * 4 + 2] = rgbData[(64 - y - 1) * 192 + x * 3 + 0]; // red
rgbaData[256 * y + x * 4 + 3] = 0;
}
}
我尝试使用 256,程序可以工作,但保存的 ARGB 是黑色还是透明,我不确定。 RGB 工作正常。我可以看到 RGB 图像。但也不在 ARGB 中 ...
还有这个
来源:
for (int i = 0; i < chunkSize; ++i)
{
// Transparent pixel
rgb32x32x3[96 * y + x * 3 + 0] = transparentColor;
rgb32x32x3[96 * y + x * 3 + 1] = transparentColor;
rgb32x32x3[96 * y + x * 3 + 2] = transparentColor;
x++;
if (x >= 32)
{
x = 0;
++y;
}
}
更改为
for (int i = 0; i < chunkSize; ++i)
{
// Transparent pixel
rgb32x32x3[192 * y + x * 3 + 0] = transparentColor;
rgb32x32x3[192 * y + x * 3 + 1] = transparentColor;
rgb32x32x3[192 * y + x * 3 + 2] = transparentColor;
x++;
if (x >= 64)
{
x = 0;
++y;
}
}
如何计算argbData?
它将有助于理解图像像素是如何存储的。每个像素在rgba中为4字节,在rgb中为3字节。像素以行优先方式存储。每行像素中的字节数称为“步幅”。在这种情况下,步幅为
imageWidth * bytesPerPixel
,但并非必须如此,对于大多数图像格式,步幅是一个显式图像参数。
那么
128*y+x*4+0
分解int
<stride> * y + x * <bytesPerPixel> + <channel>
rgbaData[128 * y + x * 4 + 0] = rgbData[(32 - y - 1) * 96 + x * 3 + 2];
(32 - y - 1)
部分将导致行在水平面上镜像。 IE。输入的底行将被复制到输出的顶行。不同的通道也会将图像从 BGR 更改为 RGB,反之亦然。
rgbaData[128 * y + x * 4 + 3] = 0;
这对我来说非常可疑,因为它可能会将 alpha 通道设置为零,即完全透明,而这对我来说似乎是错误的。
我不确定你的程序的具体用途是什么,据我所知,它是从 32x32 图像到 64x64 图像的正确转换。但如果唯一的目的是从 RGB 转换为 RGBA,它可能应该将 Alpha 通道设置为完全可见,而不是执行诸如翻转 RGB 顺序或镜像图像之类的操作。所以我会检查输出缓冲区的像素格式是否正确。
我还建议编写与大小无关的代码,即将图像大小作为参数而不是硬编码值。如果您不确定 rgba 值的顺序,请尝试将通道设置为 byte.MaxValue,然后使用图像编辑程序验证正确的通道是否受到影响。我自己经常对通道的顺序感到困惑,有些地方使用 RGB,有些地方使用 BGR 来表示同样的事情,这并没有帮助。