まず、これが重複していることをお詫びします。しかし、私のGoogle-fuは今日私を失敗させているようです.
Photoshop 用の画像フォーマット モジュールを作成中ですが、このフォーマットの保存オプションの 1 つに 4 ビット アルファ チャンネルが含まれています。もちろん、変換しなければならないデータは 8 ビット/1 バイトのアルファです。そのため、基本的にアルファの 2 バイトごとに取得し、それを 1 つにマージする必要があります。
私の試み(以下)、改善の余地がたくさんあると思います:
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 ビットのアルファ データと 4 ビットのアルファ データを含むベクトルです。2バイトを1の値に減らすと、「解像度」が失われることはわかっていますが、これを行うためのより良い方法があると思わずにはいられません。
追加情報については、逆のループを次に示します (Photoshop の形式から 4 ビット アルファを 8 ビットに変換します)。
alphaData は上記と同じ目的を果たし、imgData は生の画像データを保持する unsigned char ベクトルです。(アルファ データは、この特定の形式の変形で画像の実際の 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;
}