【GO】画像処理【draw】


“golang.org/x/image/draw”を使って色々します。

前にScaleを使いましたが、drawで他に何ができるかのサンプル付きメモ。

対象はDraw, Copy, DrawMask, Transformです。

ベースソース

基本形はこんな感じでテストしていきます。

使わせてもらう画像はおなじみのレナさんにします。

draw.Draw

masknilにしてDrawMaskを呼びます。

イメージソースの開始点を設定して上書きモードで描画しています。

今回はoutも同サイズでソースが(100,0)を起点にしているので右側100pxは入力なしで黒くなっています(png出力の場合は透過される)。

draw.Copy

xのコマンドで内部的にはオプションのDstMaskがなければDrawMask、あればNearestNeighbor.Scaleを呼びます。

微妙に使い方が違うので注意。

DrawとCopy
今回はoutの描画開始位置を(100,0)にしたので左100pxが黒くなります。

draw.DrawMask

DrawCopyでも使われている関数。

マスクを設定して描画できます。

以下のようにマスクを用意すると円状に切り抜けます。

draw.Transform

“golang.org/x/image/math/f64″を使ってアフィン変換できます。

拡大縮小、回転、平行移動とせん断が可能です。

回転は左上(0,0)を中心に行われるので90℃回転させるには画像サイズ分変更移動が必要になります。

これは回転と全体縮小のコード。回転のために平行移動もしている。

X,Y方向の拡大縮小と、せん断も可能です。

せん断によって平行四辺形(片方のせん断)、ひし形(両方のせん断)に変形可能ですが、アフィン変換では台形にはできません。

注意点

デコードした画像に直接描画しようとするとエラーになります。

cannot use img (type image.Image) as type “image/draw”.Image in argument to “golang.org/x/image/draw”.Draw:image.Image does not implement “image/draw”.Image (missing Set method)

これはimage.ImageがインターフェースでSetメソッドがないためです。

image.RGBAのようなSetメソッドを持つ必要があります。

画像形式に基づいた形式にアサーションすることで直接書き込み可能です。


コメントを残す

メールアドレスが公開されることはありません。