You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为64x64px精灵计算ARGB与RGB?代码适配问题咨询

问题描述

我正在修改一款原本面向32x32px精灵的ItemEditor程序,需要将其适配为64x64px尺寸。已完成以下修改:

1. 修改Sprite类常量

原代码:

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

2. 调整RGB转ARGB的循环代码

原代码:

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;
    }
}

3. 调整透明像素填充代码

原代码:

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;
    }
}

目前程序可正常运行,但保存后的ARGB图像显示为黑色或全透明,RGB显示正常。请问如何正确计算argbData的索引?


解决方法

问题核心出在ARGB数据的Alpha通道设置和通道顺序匹配上,结合你的代码给出具体修正方案:

1. 修复Alpha通道值

你当前将Alpha通道(数组索引+3的位置)设为0,这会导致像素完全透明(显示为黑色或透明,取决于渲染逻辑)。如果不需要透明效果,直接将Alpha设为255(完全不透明):

rgbaData[256 * y + x * 4 + 3] = 255; // 完全不透明

如果需要保留RGB中的透明信息,可通过判断像素是否为透明色来设置Alpha:

byte r = rgbData[(64 - y - 1) * 192 + x * 3 + 0];
byte g = rgbData[(64 - y - 1) * 192 + x * 3 + 1];
byte b = rgbData[(64 - y - 1) * 192 + x * 3 + 2];
// 假设transparentColor是你定义的透明色值
rgbaData[256 * y + x * 4 + 3] = (r == transparentColor && g == transparentColor && b == transparentColor) ? (byte)0 : (byte)255;

2. 验证通道顺序是否匹配ARGB标准

ARGB的通用存储顺序是Alpha、Red、Green、Blue,但你当前代码用的是Blue、Green、Red、Alpha(BGRA)顺序,若目标系统/渲染逻辑要求ARGB顺序,需调整通道位置:

// ARGB顺序:Alpha → Red → Green → Blue
rgbaData[256 * y + x * 4 + 0] = 255; // Alpha
rgbaData[256 * y + x * 4 + 1] = rgbData[(64 - y - 1) * 192 + x * 3 + 0]; // Red
rgbaData[256 * y + x * 4 + 2] = rgbData[(64 - y - 1) * 192 + x * 3 + 1]; // Green
rgbaData[256 * y + x * 4 + 3] = rgbData[(64 - y - 1) * 192 + x * 3 + 2]; // Blue

可通过交换通道顺序测试,确认哪种符合程序的渲染要求。

3. 确认Y轴翻转逻辑的正确性

你当前代码中(64 - y - 1)是对Y轴的翻转,若RGB显示正常说明该逻辑没问题。如果修改Alpha和通道顺序后仍异常,可暂时去掉翻转逻辑验证:

// 替换为直接使用y,测试ARGB是否显示正常
rgbData[y * 192 + x * 3 + 2]

4. 检查数组边界合法性

你的rgbData索引计算最大值为(63)*192 + 63*3 + 2 = 12287,刚好是RGBPixelsDataSize-1(12288-1),索引合法无需调整。只需确保rgbaData初始化长度为ARGBPixelsDataSize(16384),避免数组越界导致数据损坏。


内容的提问来源于stack exchange,提问作者DoDr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:39:51