Ruby - RMagick で画像内に透かしを描画!
Updated:
以前、RMagick(Ruby で画像処理ライブラリ ImageMagick を扱える RubyGems ライブラリ)で画像内に文字を描画しました。
今回は、少し異なる方法で既存の画像に透かし文字を描画してみました。(require も RMagick
でなく rmagick
に変更になっていますし)
0. 前提条件
- Linux Mint 17.3(64bit) での作業を想定。
- Ruby 2.3.0-p0 で作業・動作確認。
- 画像編集ソフト ImageMagick(当方は 6.7.7-10) インストール済み。
- RubyGems ライブラリ RMagick インストール済み。
1. Ruby スクリプト作成
以下のような画像内にコピーライトの透かしを描画する Ruby スクリプトを作成してみた。
概要はスクリプト内にコメントで記述している。
File: rmagick_watermark.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#! /usr/local/bin/ruby
# coding: utf-8
#----------------------------------------------------
# Ruby script to write a watermark by rmagick.
#
# date name version
# 2016.04.24 mk-mode.com 1.00 New creation.
#
# Copyright(C) 2016 mk-mode.com All Rights Reserved.
#----------------------------------------------------
require 'rmagick'
class RmagickWatermark
TEXT = "©#{Time.now.year} mk-mode.com" # 描画文字
def initialize
exit unless check_arg
@img = Magick::Image.read(@file_in).first # 元の画像オブジェクト
@img_wm = Magick::Image.new(@img.columns, @img.rows) # ウォーターマークの画像オブジェクト
@gc_wm = Magick::Draw.new # ウォーターマーク画像の描画オブジェクト
@file_out = @file_in.sub(/(.+)\.(.+?)$/, "#{'\1'}-wm.#{'\2'}") # 保存ファイル名
end
def write_wm
# 元画像と同じサイズの画像オブジェクトに文字を描画
@gc_wm.annotate(@img_wm, 0, 0, 0, 0, TEXT) do
self.gravity = Magick::CenterGravity # 描画位置(右下なら SouthEast etc.)
self.pointsize = 48
self.font_family = "Courier"
self.font_weight = Magick::BoldWeight
self.stroke = "none"
end
# 影描画(光源315度)
@img_wm = @img_wm.shade(true, 315)
# 画像の重ね合わせ
@img.composite!(@img_wm, Magick::CenterGravity, Magick::HardLightCompositeOp)
# 画像の保存
@img.write(@file_out)
puts "Wrote #{@file_out}!"
rescue => e
msg = "[#{e.class}] #{e.message}\n"
msg << e.backtrace.map { |tr| "\t#{tr}"}.join("\n")
$stderr.puts msg
exit 1
end
private
def check_arg
ret = true
begin
unless ARGV[0]
puts "Usage: ./rmagick_watermark.rb /path/to/target_image"
ret = false
end
@file_in = ARGV[0]
return ret
rescue => e
raise
end
end
end
RmagickWatermark.new.write_wm if __FILE__ == $0
2. Ruby スクリプト実行
文字を描画したい画像を用意して、先ほど作成した Ruby スクリプトを実行してみる。
$ ./rmagick_watermark.rb test.jpg
Wrote test-wm.jpg!
3. 実行結果確認
【元の画像】
【文字描画後の画像】
画像に透かし文字が描画された。
4. その他(コピーライトについて)
今回の例ではコピーライトを表示させている。
本来はこの世の全ての著作物には著作権が存在し、コピーライトを表示しなくとも著作物は保護されるべきである。
敢えてコピーライトを表示する場合は、最低限 “Copyright” もしくは © マーク、著作物の創造された年、著作権者名を表示すればよいことになっている。
“Copyright © 2009-2016 hoge All rights reserved.” のような記述方法は、より念を押した記述方法と言える。
参考サイト
意外と容易に画像に透かし文字を描画できます。
単純に文字を描画するよりデザイン性が高いので、今後何かと利用していきたいと考えております。
また、透かし文字ではなく「電子透かし」についても理解を深めたいとも考えております。(こちらは、時間に余裕ができたらの話)
以上。
Comments