gpt4 book ai didi

c++ - 两个字节合二为一

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:23 24 4
gpt4 key购买 nike

首先,如果这是重复的,我深表歉意;但我的 Google-fu 今天似乎让我失望了。

我正在为 Photoshop 编写图像格式模块,此格式的保存选项之一包括一个 4 位 alpha channel 。当然,我必须转换的数据是 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 数据的 vector 。我意识到将两个字节减少为一个字节的值必然会导致“分辨率”丢失,但我不禁认为有更好的方法可以做到这一点。

有关额外信息,这里是执行相反操作的循环(将 4 位 alpha 从格式转换为 8 位 Photoshop)

alphaData 的用途与上述相同,而 imgData 是一个保存原始图像数据的无符号字符 vector 。 (在此特定格式的变体中,alpha 数据附加在图像的实际 rgb 数据之后)

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

最佳答案

你确定是

alphaData[x2]=lo*17;
alphaData[x2+1]=hi*17;

不是

alphaData[x2]=lo*16;
alphaData[x2+1]=hi*16;

在任何情况下,要生成与您发布的解码函数一起使用的值,您只需反转操作即可。所以乘以 17 变成除以 17,移位和掩码被重新排序,看起来像这样:

for(int x=0,w=0;x < alphaData.size();x+=2,w++)
{
unsigned char alpha1 = alphaData[x] / 17;
unsigned char alpha2 = alphaData[x+1] / 17;
Assert(alpha1 < 16 && alpha2 < 16);
alphaFinal[w]=(alpha2 << 4) | alpha1;
}

关于c++ - 两个字节合二为一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18093035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com