如何为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
相关产品推荐
相关产品推荐

