ちょっと前に少しはまったことです。
ネットで情報を調べて、そのものズバリの情報があまりなかったので、同じことではまる人がいそうなのでメモしておきます。
perlの画像処理でよく使う「ImageMagick」というライブラリがあります。この「ImageMagick」には、領域の切り出しに使う「Crop」という命令があります。
この「Crop」ですが、日本語に訳すと、「切り取り」とか「切り出し」という意味になります。写真などをトリミングすることも「Crop」と言います。
この「Crop」による、内部処理と原点の扱いについて、まとめておきます。
以下、ImageMagickの6.2.8での挙動です。
● 「Crop」の挙動
この「Crop」を、画像を示す変数「$img」に対して、以下のように使ったとします。
$img->Crop(width=>100, height=>150, x=>10, y=>20);
すると、この「$img」は、横100、高さ150の画像として、以後扱えます。
この時、注意しなければならないのは、この「Crop」を行った画像の原点は、「横100、高さ150の領域の左上」ではないということです。
「横100、高さ150の領域の左上」に対して「X方向-10、Y方向-20」の位置が原点になります。
つまり、元の画像の原点の位置が、「Crop」後も維持されます。
図で描くと、以下のような感じです。
元の画像(原点はここのまま)
↓
┏━━━━━┓
┃┌───┐┃←Cropした画像
┃│絵絵絵│┃
┃└───┘┃
┗━━━━━┛
● 「Crop」の内部処理
なぜならば、この「Crop」という命令は、画像の画素データを、新しく切り出す命令ではないからです。
「Crop」は、画像描画の際の、「処理領域を決めるだけ」の命令だからです。この命令は、元の画像にマスクを掛けて、その内部だけを、他の画像のように振舞わせます。
「Crop」は、元の画像を維持したまま、「Crop領域」を作成します。
● 「Crop」の内部処理がよく分かるケース
この「Crop」の内部処理の様子がよく分かるのは、「Crop」した画像を再度「Crop」した場合です。
以下のように、「Crop」したあとに、再度「Crop」を行います。
$img->Crop(width=>100, height=>150, x=>10, y=>20);
$img->Crop(width=>100, height=>150, x=>60, y=>20);
画像は欠けずに、そのまま新たな「Crop」領域が作成されます。
なので、上記のような内部処理を行っているのだと推測できます。
● まとめ
「Crop」の内部処理と、原点維持の挙動を理解していないと、たまに面倒な事態に出会います。
ネットにあまり情報がないようでしたので、簡単にまとめておくことにしました。