2013年2月27日水曜日

boost::dynamic_bitset で byte配列にコピー

 せっかくサンプルを作ったので…
#include <boost/dynamic_bitset.hpp>
#include <boost/format.hpp>
#include <iostream>

int main() {
  typedef boost::dynamic_bitset<unsigned char> ubits;

  ubits bitset(16); // 16 bits

  for( int i = 0; i < 16; ++i ) {
    bitset[i] = i % 2;
  }

  char buf[2];
  
  boost::to_block_range(bitset, buf);

  std::cout << (boost::format("%x %x") % (int)buf[0] % (int)buf[1]).str() << std::endl;

  return 0;
  
}
実行結果
ffffffaa ffffffaa

2013年2月13日水曜日

雪あかりの路2013

 今年も行って来ました。小樽・雪あかりの路。実は Google+ をやっている影響で、だんだんとカメラに毒されてきまして、ミラーレス一眼レフ NEX-5R を買いました。iPad のカメラも十分に綺麗なんですが、やっぱ、カメラが違うと、面白いです。まだまだ、使い方がわからなくて、お任せモードで撮ってます。








 この写真なんかは、手振れ補正夜景モードというので撮ってます。本当は通路に人が居たはずなんですが、5枚ぐらい連続でバシャバシャバシャバシャバシャと撮影して合成されると、人が消えてました( ゚д゚)









 例年だと、あっ!この場所のこの構図が良い!とか、ビビっ!と閃くんですけど、カメラ入手して気負っていたせいか、ちーっともビビっ!と来ませんでしたw。なので、よし!三脚で気合入れて撮影するぞーと、三脚まで買って持って行ったのに、1回も使いませんでした。

 あ!鴨がいっぱいおる!と思って iPad で写しても、なんだかよくわからないですけど、一眼レフだと、ちゃんと写ってるあたりは、さすがだと思います。

運河も綺麗ですね




2013年2月7日木曜日

本日のバグTIFF編

本日のバグの紹介です。
TIFF の情報を調べるクラスを作っていて
class tiffinfo {
private:
  uint32_t image_width_;
  uint32_t image_height_;
  uint16_t tile_width_;
  uint16_t tile_height_;
  uint16_t samples_per_pixel_;
  ...
};
みたいなメモリレイアウトになってたんですわ。
LibTIFFのAPI 設計には、いろいろと不満たらたらで、かなりフラストレーションたまってます。この中に TIFF の TAG値を取得するAPIがあって、
extern int TIFFGetField(TIFF* tif, uint32 tag, ...);
という形式なんです。
で、いろんなタグがあるんですが、サイズがよくわからない。まぁ、サイズがよくわからないのは、ドキュメントをちゃんと読んでないのバレバレなんですけどね(>_<)
  if( 1 != TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel_) ) {
    ...
  }
  ...
  TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tile_width_);
  TIFFGetField(tif, TIFFTAG_TILELENGTH, &tile_height_);
はい、勘の良い人ならわかったでしょうか?実は、tile_width_ と tile_height_ は、uint32_t じゃないといかんのでした。
まずい事に、リトル・エンディアンだと、その箇所のサイズを間違った事を簡単に気が付きません。
ウィンドウズだとアライメントが 32bit なんで、この問題は表面化しません。ndk で開発してると、アライメントが 16bit あたりだったんでしょうね〜。tile_height_ を読みだした瞬間に samples_per_pixel_ のメモリ領域に上位 16bit の値 0 で上書きですわ。 怖い怖い。