2007年 02月 23日

あー失敗したなぁっていう言動が……
あとぼくはリアクション過剰症なので反応の 70-80% ぐらいが正しい反応だと思われます。事前にぼくのほうでそれを処理してから外にだすほうが実装としてスマートなのですがいかんせんうまくいかないのです。

dcraw のソース読んでた/読んでる

raw 現像のプロセスをやってみたくてうだうだやってるけれど、いまだにファイルパースから抜けられない。ちなみに CR2 (Camera Raw 2 だか Canon Raw 2 だか)
CR2 自体は TIFF で、サムネイル (小と中?) と raw データがまとまって入っている (あとなんか謎の IFD が一個ある) のだけれど、raw データはさらに JPEG でラップされてハフハフされてる。ちなみに TIFF の構造は使っているけど TIFF としては Invalid (raw の IFD は width や height を持ってなかったり、あと前記の謎の IFD があったり) なので扱いにくい。
思うに、Adobe DNG に変換してからやったほうがいいとは思うんだけど、結局 Adobe DNG も TIFF+JPEG なんだ?みたいなのをソース読んだりして感じたので今のままやってたりたり。というか DNG SDK をダウンロードしようと思ったらできなかったのでそのうちやるみたいな感じで。DNG に対応したって、結局ベイヤーたんじゃないならびのやつは独自に書いてあげないといけないんだろうし (そうじゃないと raw じゃない) なんかあんま意味あんのかなと思ったり思わなかったり。そこらへんってどうなってるんだろう。

どうでもいいといえばどうでもいいけど、dcraw は goto とかグローバル変数とか使いまくりでしかも、バアタリティ全開のメーカー名が入った変数名とか省略済み変数名とかありまくりなので読みにくさがやばくてっていうかもうソースだけで読むとか無理というか、途中の機器判定のロジックとかソース読んだだけじゃマジックナンバーが多すぎて意味不明なので結局実際にファイルを読み込ませて gdb を追ったっていうかなんていうか……

眠いので、寝よう

http://lab.lowreal.net/trac/browser/c/tiff.rb (書いた TIFF パーサ。ろくにテストしてない。先にテスト書くべきだった。けど、ちょうどいいデータがなくてめんどくさかった)

DNG の仕様を読む

実装に秋田ので DNG を適当に読んでみる。秋田っていうか JPEG のパースが思ったより (TIFF より) めんどい……
仕様は書き込み側 (カメラメーカ) 向けに書いてあるっぽい感じ (Adobe が書いてるんだからそりゃそうだろうけど)

DNG のポイント

  • TIFF 互換だよ
  • 絶対ではないけどサムネイルも作ってくれるとうれしいな (サムネイルを含む可能性がある)
  • RAW データの IFD には NewSubFileType を 0 に設定しようね。サムネイルとかは 1 にするよ。
  • カメラソフトウェア設計者は CPU にあわせてバイトオーダーを選んでいいよ (DNG はどっちもサポートするよ=TIFF と同じ)
  • センサー周辺のゴミピクセルは収録してもしなくてもいいよ。収録する場合は ActiveArea に有効画素を記録してね
  • メタデータはいくつか格納法があるよ。TIFF-EP と EXIF はどっちもだいたい同じで、いちおうどっちもサポートするけど、EXIF のほうがお勧めかな (決めろよといいたい)
  • BitsPerSample は 8 から 32bits までサポートするけど、8 16 32 以外の場合は上位ビットをうめてね。
  • Compression で格納データの種類がわかるよ。1 は無圧縮、7 は JPEG 圧縮だ。7 の場合、If PhotometricInterpretation = 6 (YCbCr) and BitsPerSample = 8/8/8, or if PhotometricInterpretation = 1 (BlackIsZero) and BitsPerSample = 8, then the JPEG variant must be baseline DCT JPEG. それ以外の場合は lossless JPEG として格納しないといけないよ。
  • JPEG の width, height は純粋にサンプリングの数をいれてくれればいいよ。
  • PhotometricInterpretation で種類がわかるよ。1, 2, 6 はサムネイルにだけ使われる普通の画像データの種類を識別するやつで、32803 は CFA (カラーフィルター配列)、34892 がリニア RAW (CFA 使ってないカメラ用) だよ。
  • CFARepeatPatternDIM でカラーフィルターパターンのサイズを指定して、CFAPattern でどういう構成になってるかを指定するよ

あといろいろあるけどあきた
カラーフィルターパターンから現像プロセスを算出すればメーカーごとに全部実装するとかはしなくていいようになってるのか。カラーフィルターの値の設定があればいい、みたいなのかな。

YAPC

ちけっとかった。 loppi の前で10分ぐらい

AS3 名前空間

http://d.hatena.ne.jp/nitoyon/20070220/p1
ほー。名前空間の問題っぽいので、クラス中のアクセス方法を変えれば大丈夫なようだ?

package {
	import flash.display.*;
	import flash.text.*;
	import flash.events.Event;
	import flash.utils.*;

	public class HelloWorld extends Sprite {

		public function HelloWorld() {
			var sample:Sample = new Sample();
			log(sample.sample); //=> "fuge"
			// sample.sample = "hoge"; //=> Error: プロパティは読み取り専用です。 (public を通してアクセスしているが、setter が定義されていないため)
			// sample.private::sample = "hoge"; //=> Error: アクセスできないプロパティ sample へのアクセスを、静的型 HelloWorld.as$0:Sample の参照を使用して試行し ました。(private が特別なため)
		}
	}
}

class Sample {
	public function Sample () {
		private::sample = "hoge";
		log(public::sample); //=> "hoge"
		private::sample = "fuge";
		log(public::sample); //=> "fuge"
	}

	private var _sample:String;

	public function get sample():String {
		return _sample;
	}

	private function set sample(v:String):void {
		_sample = v;
	}
}

内部からは接頭辞つけて明示してあげるといける。これでいいのかはわからないけど


あとついでに、

package {
	import flash.display.*;
	import flash.text.*;
	import flash.events.Event;
	import flash.utils.*;


	public class HelloWorld extends Sprite {

		namespace unco = "http://lowreal.net/ns/sample";

		public function HelloWorld() {
			var sample:Sample = new Sample();
			log(sample.sample);
			sample.unco::sample = "hoge"; // もちろんエラーはでない
			log(sample.sample); //=> "hoge"
		}
	}
}

class Sample {
	public function Sample () {
		private::sample = "hoge";
		log(public::sample);
		private::sample = "fuge";
		log(public::sample);
	}

	namespace hoge = "http://lowreal.net/ns/sample";

	private var _sample:String;

	public function get sample():String {
		return _sample;
	}

	private function set sample(v:String):void {
		_sample = v;
	}

	hoge function set sample(v:String):void {
		_sample = v;
	}
}

とかキモいことができるみたいだ。