首先,如果这是重复的,我深表歉意;但我的 Google-fu 今天似乎让我失望了。
我正在为 Photoshop 编写一个图像格式模块,这种格式的保存选项之一包括一个 4 位 alpha 通道。当然,我必须转换的数据是 8 位/1 字节的 alpha - 所以我需要基本上每两个字节的 alpha,并将其合并为一个。
我的尝试(下),我相信还有很大的改进空间:
for(int x=0,w=0;x < alphaData.size();x+=2,w++)
{
short ashort=(alphaData[x] << 8)+alphaData[x+1];
alphaFinal[w]=(unsigned char)ashort;
}
alphaData 和 alphaFinal 是分别包含 8 位 alpha 数据和 4 位 alpha 数据的向量。我意识到将两个字节减少为一个的值,必然会导致“分辨率”的损失,但我不禁想到有更好的方法来做到这一点。
有关更多信息,这里是执行相反操作的循环(将 4 位 alpha 从格式转换为 Photoshop 的 8 位)
alphaData 的用途与上述相同,而 imgData 是一个保存原始图像数据的无符号字符向量。(在此特定格式变体的图像的实际 rgb 数据之后添加 alpha 数据)
for(int b=alphaOffset,x2=0;b < (alphaOffset+dataLength); b++,x2+=2)
{
unsigned char lo = (imgData[b] & 15);
unsigned char hi = ((imgData[b] >> 4) & 15);
alphaData[x2]=lo*17;
alphaData[x2+1]=hi*17;
}