「Alpha Compositing - Part II」の編集履歴(バックアップ)一覧に戻る

Alpha Compositing - Part II - (2009/06/08 (月) 05:47:13) のソース

*Alpha Compositing - Part II
#center(){
|開始日|2007年03月17日|
|最終更新日|&date(j)|
}

*はじめに
[[Alpha Compositing - Part I]]で説明した方法を応用し、Web2.0的な画像を作成する方法について説明・使い方を記しています。
全4ページのうち、ここは1ページ目です。 

**原著
#center(){
「Alpha Compositing - Part II」
http://rmagick.rubyforge.org/web2/web2.html
}

**注意
-もともと個人利用を目的として日本語化したために、けっこう意訳している部分があります。「意味分からないよ」とか「おかしいんじゃない?」とかいうのがあれば、オリジナルを参照するか、コメントで質問してください(がんばって調べます)。

**用語
訳文に出てくる各語に対応する原文と意味を以下に記します。
#center(){
|訳語|原文|意味|
|元画像|source image|合成しようとしている画像。|
|合成先画像|destination image|元画像の下に重ねる画像。|
}

**更新履歴
-2008/3/17 作成開始(Part1から1年以上経ってしまった・・・。しかもWeb2.0ってブーム過ぎてるし)
-2008/3/19 とりあえず作成完了。あとはチマチマ微修正。

----
*訳文

Tommy Maloneyの[[Web 2.0 Design Kit>http://www.photoshoplab.com/web20-design-kit.html]]は、Photoshopを使ってWeb2.0チックなエフェクトを作成するチュートリアル記事が書かれたサイトだ。私はこのチュートリアルを試してみて、すぐに気付いたよ。自分の書いたアルファコンポジットのPart2を書かなきゃってね(まだ読んでないなら、[[ここ>Alpha Compositing - Part I]]を読んでくれ)。

このチュートリアルでは、Part1で紹介したエフェクトをもう1度使って、PhotoshopではなくRMagickによるWeb 2.0 Design Kitの説明をする。でも、できたら始める前に[[本家のページ>http://www.photoshoplab.com/web20-design-kit.html]]を一通りこなし、チュートリアル内で画像が作成される様子を見ておいてほしい。RMagickバージョンの完成画像は、下のイメージのようにちょっと違っているからね。

#image(result.jpg,title=Result,center)

以降では、このイメージをRMagickでどうやって作成していくかを紹介する。そうだ、Part1で説明したコンポジット(composite)に加え、テキストを描画するためにDrawクラスからannotateを、背景のグラデーションにはGradientFillクラスを、そして影の作成にblur_imageを使う。そしてappend、rotate、negateメソッドもだ。

**グラス効果(The glass effect)
最初のエフェクトは反射、いや「グラス」エフェクトだ。始める前に、作業場を片付けておくんだ。そしてImageListオブジェクトに貯め込んでいく画像や、グラデーションの大きさを決める2つの定数を定義してくれ。

#codehighlight(ruby){{
require 'RMagick'
include Magick

WIDTH = 650
HEIGHT = 40

stripes = ImageList.new}}

それじゃ、背景にブルーグレイのストライプを作るところから始めよう。こいつは2つのグレイスケールのグラデーションを組み合わせることで出来る。2つのグラデーションを持つ画像を上下に重ねて1つの画像にして、compositeメソッドのColorizeCompositeOpで色を重ねるだけだ。

グラデーション属性を、GradientFillクラスの2つのインスタンスによって作ろう。
GradientFill.newメソッドには6個の引数が必要だ。最初の4つは直線か座標に使われ、残りの2つはグラデーションの色を決める。そうするとグラデーション属性として、最初の直線(or座標)から1つ目の色で始まり、2つ目に指定した色に残る直線(or座標)へと変化しながら出来上がる。

色:#ddddddで画像上端の線から、色:#888888で画像下端の線に向かうグラデーションを作る。そしてそれをImage.newの第3引数、つまりfill属性に渡すことで、画像が出来上がる、というわけだ。
出来上がった画像はstripesに突っ込んでおいてくれ。
#codehighlight(ruby){{
top_grad = GradientFill.new(0, 0, WIDTH, 0,
    "#dddddd", "#888888")
stripes << Image.new(WIDTH, HEIGHT, top_grad)
}}
次にもう少し暗い色でグラデーション属性を作り、画像を作る。stripesに追加するのも同じだよ。
#codehighlight(ruby){{
bottom_grad = GradientFill.new(0, 0, WIDTH, 0,
    "#757575", "#555555")
stripes << Image.new(WIDTH, HEIGHT, bottom_grad)
}}
さあ、画像を見てみよう。まずこれが上端の画像だ。

#image(http://rmagick.rubyforge.org/web2/top_grad.jpg,title=top image,center)

こちらは下端の画像。

#image(http://rmagick.rubyforge.org/web2/bottom_grad.jpg,title=bottom image,center)

この2つをくっつけて、1つの画像を作る。appendメソッドはtrueかfalseかの1引数のみ取る。trueだと画像は上下に重ねられ、falseだと左右に並べられるよ。
#codehighlight(ruby){{
combined_grad = stripes.append(true)
}}
今回はtrueだから上下に重ねられる。そして、結合後の画像がこれだ。

#image(http://rmagick.rubyforge.org/web2/combined_grad.jpg,title=combined image,center)

**色の合成(The colorize composite operation)
いい感じになってきた。

さて次は色味を与えよう。グレイスケールのグラデーションに色味を与える場合はcompositeメソッドを使うよ。[[Part1>Alpha Compositing - Part I]]で、アルファコンポジットには元画像と合成先画像の2つを使ったのを覚えているかい?今回は、合成先画像にたった今作ったグラデーション画像を使うんだ。だから、元画像をこれから作る。これで画像に色味が加えられるわけだ。

合成するグラデーション画像と同じサイズの元画像を作ってほしい。ソリッドな青色の背景だね。

#codehighlight(ruby){{
color = Image.new(combined_grad.columns, combined_grad.rows) do
         self.background_color = "#87a5ff"
end
}}
この画像を表示すると、こうなっている。

#image(http://rmagick.rubyforge.org/web2/blue_color.jpg,title=blue image,center)

ところで、Part1で説明したsrc-overによる合成は、元画像のピクセルを合成先の画像で置き換えてしまう。これだとちょっとマズいのは分かるよね。せっかく作ったグラデーションが青一色になってしまうから。今回はそうでなく、元画像と合成先画像とをブレンドしたい。
そうするには、色のHue(色相)、Saturation(彩度)、Brightness(明度)((訳注:原文は明度に「lightness」を用いていましたが、日本で一般的なBrightnessを適用しました。))という用語について知っておくといいよ。

僕らは皆、色といえば赤/緑/青の組み合わせで考えるよね。これはRGB系というんだ。同様に、色相/彩度/明度の組み合わせ:HSB系も存在する。このHSB系では、色相(H)は色相環における場所を示し、明度は色がどのくらいの明るさを持っているかを示す。分かりやすい例で言えば、黒は明度0だし白は明度100(%)だね。そして彩度は鮮やかを示すんだ。

RMagickはHSL系で表された2画像間のピクセルをフルレンジで合成することが出来るんだ。用いる方法はcolorize。colorizeによる合成は、「元画像の色相と彩度」と「合成先画像の明度」を合成するよ。

さて、思い出してくれ。RMagickにおいて、合成先画像とはcompositeメソッドを送信する元のことだ。だから元画像が第1引数になる。2つ目の引数は、元画像の合成先画像に対する相対的な位置を示すわけだけど、今回は2つとも同じサイズなわけだ。さて何を使ったら良いだろう?ま、ここでは後で分かりやすくするためにCenterGravityを選んでおいたよ。
そして3つ目の引数で、どうやって合成するかを示してくれ。ColorizeCompositeOpだね。
#codehighlight(ruby){{
background = combined_grad.composite(color,
    CenterGravity, ColorizeCompositeOp)
}}
色味の着いたグラデーションはこんな感じになるよ。

#image(http://rmagick.rubyforge.org/web2/background.jpg,title=background image,center)

次は"RMAGICK"という単語を反射エフェクト付きで埋め込んでいく。

#right(){[[→ Page 2: 反射するテキストの追加>Alpha Compositing - Part II-2]]}
----
**参考サイト(訳者による追加)
-RMagickオンラインドキュメント:[[http://www.simplesystems.org/RMagick/doc/index.html]]
--compositeメソッド:[[http://www.simplesystems.org/RMagick/doc/image1.html#composite]]
--CompositeOperator定数の一覧(src-over以外にも多数あり):[[http://www.simplesystems.org/RMagick/doc/constants.html#CompositeOperator]]
--compositeメソッド(Drawクラス):[[http://www.simplesystems.org/RMagick/doc/draw.html#composite]]
--RVGのチュートリアル:[[http://www.simplesystems.org/RMagick/doc/rvgtut.html]]

----
(&counter())

* コメント
コメント大歓迎です。ただ、スパムなど内容によっては独断で削除する場合があります。あらかじめご了承ください。

#comment
ウィキ募集バナー