Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 两个字节合一_C++_Casting_Bit Manipulation - Fatal编程技术网

C++ 两个字节合一

C++ 两个字节合一,c++,casting,bit-manipulation,C++,Casting,Bit Manipulation,首先,如果这是重复的,我道歉;但我的谷歌fu今天似乎让我失望了 我正在为PS图象处理软件编写一个图像格式模块,这个格式的一个保存选项包括一个4位的alpha通道。当然,我必须转换的数据是8位/1字节的alpha-因此我需要基本上每两个字节的alpha,并将其合并为一个 我的尝试(如下),我相信有很大的改进空间: for(int x=0,w=0;x < alphaData.size();x+=2,w++) { short ashort=(alphaData[x] <<

首先,如果这是重复的,我道歉;但我的谷歌fu今天似乎让我失望了

我正在为PS图象处理软件编写一个图像格式模块,这个格式的一个保存选项包括一个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;
}
for(int x=0,w=0;x
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;
}
for(int x=0,w=0;x
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;
}
for(int x=0,w=0;xalphaFinal[w]=(alpha2
short-ashort=(alphaData[x]
short-ashort=(alphaData[x]我认为,您要做的是将一个8位值截断为一个4位值;而不是组合两个8位值。换句话说,您要删除每个alpha值的四个最低有效位,而不是组合两个不同的alpha值。
所以,基本上,你想右移4

output = (input >> 4); /* truncate four bits */
如果您不熟悉二进制移位,请使用以下随机8位数字:

10110110
>> 1
= 01011011
>> 1
= 00101101
>> 1
= 00010110
>> 1
= 00001011
所以

若要反转,请改为左移

input = (output << 4); /* expand four bits */

显然,正如您所指出的,4位精度丢失了。但您会惊讶地发现,在完全合成的作品中,它很少被注意到。

我认为,您要做的是将一个8位值截断为一个4位值;而不是合并两个8位值。换句话说,您要删除每个alpha值的四个最低有效位,而不是合并两个不同的alpha值。 所以,基本上,你想右移4

output = (input >> 4); /* truncate four bits */
如果您不熟悉二进制移位,请使用以下随机8位数字:

10110110
>> 1
= 01011011
>> 1
= 00101101
>> 1
= 00010110
>> 1
= 00001011
所以

若要反转,请改为左移

input = (output << 4); /* expand four bits */
显然,正如您所指出的,4位精度丢失了。但您会惊讶地发现,在完全合成的作品中,它很少被注意到。

这段代码

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;
}
for(int x=0,w=0;x
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;
}
for(int x=0,w=0;xshort ashort=(alphaData[x]+1,仅用于Google Fu文字游戏。+1,仅用于Google Fu文字游戏。起初我以为它是*16,但我测试的第一张图像最终是半透明的。回头看,我注意到15(一个小点的最高值)*16=240,而不是255。无论如何,我似乎有一个忽视显而易见的习惯。谢谢,效果很好!我认为你应该用四舍五入进行除法,即
(alphaData[x]+8)/17
。起初我以为它是*16,但后来我测试的第一张图像变成了半透明。回头看,我注意到15(一个半字节的最高值)*16=240,而不是255。无论如何,我似乎有一个忽视显而易见的习惯。谢谢,它工作得很好!我认为你应该用四舍五入来除法,即
(alphaData[x]+8)/17
。是的,我知道。这是一种不好的做法,但这是我做“草稿”的一种奇怪的方式.但是谢谢你对第一部分的解释-这当然有助于解释我得到的结果。是的,我知道。这是一种不好的做法-但这是我做“草稿”的一种奇怪的方式。但是谢谢你对第一部分的解释-这当然有助于解释我得到的结果。