0

各ピクセルが正確に4ビットである画像データのバイナリファイルがあります。画像データは次のようにレイアウトされています。

最初の画像が1x1、2番目の画像が2x2、3番目の画像が4x4というようにN個の画像があります(知りたい場合はミップマップです)。

データバッファの先頭へのポインタが与えられたので、最大の画像にスキップしたいと思います。

これで、スキップしたいバイト数がわかりましたが、最初に4ビットのこの厄介な1x1画像があります。とにかくポインタをビット単位でインクリメントすることに気づいていません。

すべてが4ビットずれることなくデータを正常に取得するにはどうすればよいですか?

4

2 に答える 2

4

ファイル形式を変更できると仮定すると、次のいずれかを実行できます。

  • 1x1画像にパディングを追加する
  • 画像を逆の順序で保存します(事実上上記と同じですが、画像の数が必ずしもわからないため、ミップマップには理想的ではありません)

フォーマットを変更できない場合は、次の選択肢があります。

  • データを変換する
  • バッファが0.5バイトオフセットされていることを受け入れ、それに応じて処理します

あなたが言った:

すべてが4ビットずれることなくデータを正常に取得するにはどうすればよいですか?

つまり、変換する必要があるということです。オフセットをバイト単位で計算すると、最初のオフセットに前の画像の0.5バイトが含まれていることがわかります。したがって、ピンチで次のようにシャッフルできます。

for( i = start; i < end; i++ ) {
    p[i] = (p[i] << 4) | (p[i+1] >> 4);
}

これは、最初のピクセルがビット4〜7で、2番目のピクセルがビット0〜3であると想定しています。逆の場合は、これら2つのシフトを反転します。

于 2013-02-14T22:28:51.143 に答える
0
// this assumes pixels points to bytes(unsigned chars)
index = ?;// your index to the pixel

byte_t b = pixels[index / 2];
if (index % 2) pixel = b >> 4;
else pixel = b & 15; 

// Or you can use
byte_t b = pixels[index >> 1];
if (index & 1) pixel = b >> 4;
else pixel = b & 15; 

どちらの方法でも、ファイルへの論理インデックスを計算するだけです。2で割ると、ピクセルがあるバイトの先頭に移動します。そして、バイトの正しい半分を読み取ります。

だから関数を作る

byte_t GetMyPixel(unsigned char* pixels, unsigned index) {
  byte_t b = pixels[index >> 1];
  byte_t pixel;
  if (index & 1) pixel = b >> 4;
  else pixel = b & 15; 
  return pixel; 
} 

最初の画像を読みます。

Image1x1 = GetMyPixel(pixels,0);



Image2x2_1 = GetMyPixel(pixels,1);// Top left pixel of second image
Image2x2_2 = GetMyPixel(pixels,2);// Top Right pixel of second image
Image2x2_3 = GetMyPixel(pixels,3);// Bottom left pixel of second image
... etc

これが1つの方法です。使用しているエンディアンを考慮する必要がある場合があるため、間違っていると思われる場合は、このように読み取られたピクセルのロジックを切り替えてください...

byte_t GetMyPixel(unsigned char* pixels, unsigned index) {
  byte_t b = pixels[index >> 1];
  byte_t pixel;
  #if OTHER_ENDIAN
  if (index & 1) pixel = b >> 4;
  else pixel = b & 15; 
  #else
  if (index & 1) pixel = b & 15;
  else pixel = b >> 4; 
  #endif
  return pixel; 
} 
于 2013-02-15T00:38:42.427 に答える