如何计算 64x64px 的 ARGB 和 RGB

问题描述 投票:0回答:1

我正在尝试更改此程序其项目编辑器,以显示大小为 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?

c# rgb argb
1个回答
2
投票

它将有助于理解图像像素是如何存储的。每个像素在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 来表示同样的事情,这并没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.