maraigue (owner)

Revisions

gist: 79001 Download_button fork
public
Public Clone URL: git://gist.github.com/79001.git
kabocha-miku.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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/usr/bin/env ruby
 
# ミク画像 "kabochamiku-src.png"
# (http://f.hatena.ne.jp/maraigue/20081012211841)を、
# かぼちゃミク
# (http://f.hatena.ne.jp/maraigue/20081221032946)に
# するコード。
#
# RMagickが必要
#
# 参照:http://blog.livedoor.jp/maraigue/archives/731791.html
 
require "rubygems"
require "RMagick"
 
module Magick
  class Pixel
    def get_hsv
      r = red; g = green; b = blue
      
      if r > g
        max = ((b > r) ? b : r); min = ((g > b) ? b : g)
      else
        max = ((b > g) ? b : g); min = ((r > b) ? b : r)
      end
 
      # Hue 色相(0-360)
      if max == min
        # 未定義
        h = 0
      else
        if max == r
          h = 60 * (g - b) / (max - min)
        elsif max == g
          h = 60 * (b - r) / (max - min) + 120
        else
          h = 60 * (r - g) / (max - min) + 240
        end
      end
      h += 360 if h < 0
 
      # Saturation 彩度(0.0-1.0)
      s = ((max == 0) ? 0 : ((max - min)*QuantumRange.to_f/max)/QuantumRange)
      # max == 0 のときは未定義
      
      # Value 明度(0.0-1.0) : max/(RGBそれぞれの最大値)に等しい
      [h, s, max.to_f/QuantumRange]
    end
    
    def Pixel.from_hsv(h, s, v)
      range = (h / 60).to_i
      diff_h = h - 60 * range
      
      p = (v * (1.0 - s)) * QuantumRange
      q = (v * (60 - s * diff_h) / 60) * QuantumRange
      t = (v * (60 - s * (60 - diff_h)) / 60) * QuantumRange
      v *= QuantumRange
      
      case range
      when 0; Pixel.new(v, t, p)
      when 1; Pixel.new(q, v, p)
      when 2; Pixel.new(p, v, t)
      when 3; Pixel.new(p, q, v)
      when 4; Pixel.new(t, p, v)
      else; Pixel.new(v, p, q)
      end
    end
  end
end
 
include Magick
img = ImageList.new("kabochamiku-src.png")
 
for y in 0...img.rows
  for x in 0...img.columns
    h, s, v = img.pixel_color(x, y).get_hsv
    
    if h > 120 && h < 240 && v >= 0.3
      h -= 180
      h += 360 if h < 0
      img.pixel_color(x, y, Pixel.from_hsv(h, s, v))
    end
  end
end
 
img.write("kabochamiku-out.png")