pikl 0.2.8 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/License.txt +0 -0
- data/Manifest.txt +17 -17
- data/README.txt +0 -0
- data/config/hoe.rb +9 -6
- data/config/requirements.rb +0 -0
- data/ext/pikl/extconf.rb +0 -0
- data/ext/pikl/pikl.h +617 -465
- data/ext/pikl/pikl_affine.c +38 -91
- data/ext/pikl/pikl_affine.h +0 -0
- data/ext/pikl/pikl_bitmap.c +0 -0
- data/ext/pikl/pikl_bitmap.h +0 -0
- data/ext/pikl/pikl_blur.c +4 -8
- data/ext/pikl/pikl_blur.h +0 -0
- data/ext/pikl/pikl_camera.c +218 -0
- data/ext/pikl/{pikl_effect3.h → pikl_camera.h} +2 -2
- data/ext/pikl/pikl_composite.c +175 -0
- data/ext/pikl/pikl_composite.h +12 -0
- data/ext/pikl/pikl_decrease.c +110 -45
- data/ext/pikl/pikl_decrease.h +0 -7
- data/ext/pikl/pikl_divide.c +116 -0
- data/ext/pikl/pikl_divide.h +11 -0
- data/ext/pikl/pikl_effect.c +583 -151
- data/ext/pikl/pikl_effect.h +32 -6
- data/ext/pikl/pikl_enhance.c +274 -0
- data/ext/pikl/pikl_enhance.h +20 -0
- data/ext/pikl/pikl_io.c +174 -23
- data/ext/pikl/pikl_io.h +0 -0
- data/ext/pikl/pikl_jpeg.c +0 -0
- data/ext/pikl/pikl_jpeg.h +0 -0
- data/ext/pikl/pikl_pattern.c +383 -357
- data/ext/pikl/pikl_pattern.h +0 -0
- data/ext/pikl/pikl_pixel.c +173 -0
- data/ext/pikl/{pikl_trim.h → pikl_pixel.h} +2 -2
- data/ext/pikl/pikl_png.c +0 -0
- data/ext/pikl/pikl_png.h +0 -0
- data/ext/pikl/pikl_private.h +12 -5
- data/ext/pikl/pikl_resize.c +0 -0
- data/ext/pikl/pikl_resize.h +0 -0
- data/ext/pikl/pikl_rotate.c +409 -51
- data/ext/pikl/pikl_rotate.h +8 -0
- data/ext/pikl/pikl_scrap.c +263 -483
- data/ext/pikl/pikl_scrap.h +0 -0
- data/ext/pikl/pikl_special.c +168 -0
- data/ext/pikl/{pikl_effect4.h → pikl_special.h} +2 -2
- data/ext/pikl/pikl_voronoi.c +320 -0
- data/ext/pikl/pikl_voronoi.h +37 -0
- data/lib/pikl.rb +4 -2
- data/lib/pikl/color.rb +47 -0
- data/lib/pikl/const.rb +106 -22
- data/lib/pikl/errors.rb +0 -0
- data/lib/pikl/ext.rb +115 -8
- data/lib/pikl/filter.rb +371 -0
- data/lib/pikl/image.rb +124 -117
- data/lib/pikl/version.rb +2 -2
- data/setup.rb +0 -0
- data/test/sample.jpg +0 -0
- data/test/test_helper.rb +0 -0
- data/test/test_pikl_image.rb +0 -14
- data/test/test_pikl_image2.rb +541 -0
- metadata +35 -23
- data/ext/pikl/decrease/fsdither.h +0 -554
- data/ext/pikl/decrease/median.c +0 -1179
- data/ext/pikl/decrease/median.h +0 -7
- data/ext/pikl/decrease/neuquan5.c +0 -563
- data/ext/pikl/decrease/neuquant.h +0 -62
- data/ext/pikl/decrease/wu.c +0 -447
- data/ext/pikl/decrease/wu.h +0 -7
- data/ext/pikl/pikl_effect2.c +0 -240
- data/ext/pikl/pikl_effect2.h +0 -55
- data/ext/pikl/pikl_effect3.c +0 -266
- data/ext/pikl/pikl_effect4.c +0 -495
- data/ext/pikl/pikl_rotate2.c +0 -312
- data/ext/pikl/pikl_rotate2.h +0 -19
- data/ext/pikl/pikl_trim.c +0 -28
data/lib/pikl/image.rb
CHANGED
@@ -2,7 +2,7 @@ module Pikl
|
|
2
2
|
|
3
3
|
class Image
|
4
4
|
|
5
|
-
def self.open(inpath, &block)
|
5
|
+
def self.open(inpath, &block)
|
6
6
|
image = Pikl::Image.new(inpath)
|
7
7
|
image.instance_variable_set(:@block,block)
|
8
8
|
|
@@ -75,14 +75,10 @@ module Pikl
|
|
75
75
|
end
|
76
76
|
|
77
77
|
def rotate(angle, backcolor = "#FFFFFF", sample = :bilinear)
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
else
|
83
|
-
ci = color_int(backcolor)
|
84
|
-
Ext.pkl_rotate2(@pkl_image, angle.to_f, SAMPLES[sample.to_sym], ci[0], ci[1], ci[2], ci[3])
|
85
|
-
end
|
78
|
+
ci = color_int(backcolor)
|
79
|
+
color = Ext.pkl_color_rgb(ci[0], ci[1], ci[2])
|
80
|
+
Ext.pkl_rotate(@pkl_image, angle.to_f, SAMPLES[sample.to_sym], color)
|
81
|
+
Ext.pkl_color_close(color)
|
86
82
|
self
|
87
83
|
end
|
88
84
|
|
@@ -140,109 +136,6 @@ module Pikl
|
|
140
136
|
self.height <= self.width
|
141
137
|
end
|
142
138
|
|
143
|
-
# threshold=0-255
|
144
|
-
# threshold=0の時は変化しません
|
145
|
-
# threshold=255の時は全ての色にアンシャープ処理が働きます
|
146
|
-
# edge=-10 .. 10
|
147
|
-
# edge=0の時は変化しません
|
148
|
-
# edge>0の時は値が大きいほど先鋭化されます
|
149
|
-
# edge<0の時は値が小さいほどぼやけます
|
150
|
-
#
|
151
|
-
# 想定結果が得られる範囲は-10 .. 10程度です。
|
152
|
-
# これを超える場合は、品質の保証はありません
|
153
|
-
# ※画質によりこの通りではありません。-10..10の範囲より小さくなる可能性があります。
|
154
|
-
def unshapmask(threshold, edge)
|
155
|
-
Ext.pkl_unsharp(@pkl_image, threshold.to_i, edge.to_f)
|
156
|
-
self
|
157
|
-
end
|
158
|
-
|
159
|
-
# コントラスト調整
|
160
|
-
# コントラストを強くするということは、白い部分をより白く、
|
161
|
-
# 黒い部分をより黒くするような変換を意味します。
|
162
|
-
# 逆にコントラストを弱くした場合、白い部分と黒い部分の差が無くなり、灰色っぽい画像になります。
|
163
|
-
# <rate>
|
164
|
-
# 範囲:-127 .. 127
|
165
|
-
# rate=0の時は変化しません
|
166
|
-
# * rateが0以上の時は周波数によるコントラスト強調がおこなわれます
|
167
|
-
# * rateが0未満の時は直線的に平坦化されます
|
168
|
-
def contrast(rate)
|
169
|
-
Ext.pkl_contrast(@pkl_image, rate.to_f)
|
170
|
-
self
|
171
|
-
end
|
172
|
-
|
173
|
-
# レベル補正
|
174
|
-
# ヒストグラムの平坦化をおこないます。各色の分布に偏りがある画像に有効な場合があります。
|
175
|
-
# coeff = 平坦化時の係数です。1が標準です。1より小さい場合は暗く、1より大きい場合は明るくなります(0.0..2.0)
|
176
|
-
# low = 全ピクセル数に対して、切り捨てる暗い色の総数の割合(0-100%)
|
177
|
-
# high = 全ピクセル数に対して、切り捨てる明るい色の総数の割合(0-100%)
|
178
|
-
def level(low, high, coeff)
|
179
|
-
Ext.pkl_level(@pkl_image, low.to_f, high.to_f, coeff.to_f)
|
180
|
-
self
|
181
|
-
end
|
182
|
-
|
183
|
-
# 明るさ調整
|
184
|
-
# この明るさ調整は各色からcolor値を加算する単純な処理です。
|
185
|
-
# colorに255を指定すれば、ただの白い画像になります
|
186
|
-
# colorに-255を指定すると、ただの黒い画像になります。
|
187
|
-
def brightness(color)
|
188
|
-
Ext.pkl_brightness(@pkl_image, color.to_i)
|
189
|
-
self
|
190
|
-
end
|
191
|
-
|
192
|
-
# 輝度(明るさ)・彩度(鮮やかさ)・色相(色合い)調整
|
193
|
-
# * 具体的にどういうことかを理解したい場合は、mspaintの「色の編集」を見ると良いでしょう。
|
194
|
-
# ym(輝度) -1 .. 1(0.1で10%up).0では変化なし
|
195
|
-
# sm(彩度) -1 .. 1(0.1で10%up).0では変化なし
|
196
|
-
# hd(色相) 360.0度回転(R=113.2/Ye=173.0/G=225.0/Cy=293.2/B=353.0/Mg=45.0).360の倍数では変化なし
|
197
|
-
def hls(ym, sm ,hd)
|
198
|
-
Ext.pkl_hls(@pkl_image, ym.to_f, sm.to_f, hd.to_f)
|
199
|
-
self
|
200
|
-
end
|
201
|
-
|
202
|
-
# gamma correction
|
203
|
-
# _gm_ :: compensating rate.
|
204
|
-
# gm must be >= 0 and image is neutral if gm value is 1.0.
|
205
|
-
def gamma(gm)
|
206
|
-
Ext.pkl_gamma(@pkl_image, gm.to_f)
|
207
|
-
self
|
208
|
-
end
|
209
|
-
|
210
|
-
# mosaic effect
|
211
|
-
# _width_ :: width for mosaic unit.
|
212
|
-
# _height_ :: height for mosaic unit.
|
213
|
-
def mosaic(width, height)
|
214
|
-
Ext.pkl_mosaic(@pkl_image, width, height)
|
215
|
-
self
|
216
|
-
end
|
217
|
-
|
218
|
-
# compose image
|
219
|
-
# _image_ :: another pikl image object.
|
220
|
-
# _xpos_ :: left position of composing image.
|
221
|
-
# _ypos_ :: top position of composing image.
|
222
|
-
def compose(image, xpos, ypos)
|
223
|
-
Ext.pkl_composite(@pkl_image, image.rawdata, xpos, ypos)
|
224
|
-
self
|
225
|
-
end
|
226
|
-
|
227
|
-
# mediancut to decrease colors.
|
228
|
-
# _ncolors_ :: num of colors.(1..256)
|
229
|
-
# _dither_ :: dither. true/false
|
230
|
-
def mediancut(ncolors, dither)
|
231
|
-
dither = dither ? 1 : 0
|
232
|
-
Ext.pkl_mediancut(@pkl_image, 4, dither)
|
233
|
-
self
|
234
|
-
end
|
235
|
-
|
236
|
-
# alphablend
|
237
|
-
# _image_ :: another pikl image object.
|
238
|
-
# _xpos_ :: left position of blend image.
|
239
|
-
# _ypos_ :: top position of blend image.
|
240
|
-
# _alpha_ :: alpha: α-value(0-255). 255 is complete transparent.
|
241
|
-
def alphablend(image, xpos, ypos, alpha)
|
242
|
-
Ext.pkl_alphablend(@pkl_image, image.rawdata, xpos, ypos, alpha);
|
243
|
-
self
|
244
|
-
end
|
245
|
-
|
246
139
|
# regular expressions to try for identifying extensions
|
247
140
|
def split_extensions(path)
|
248
141
|
filename = path.split('/').last
|
@@ -267,11 +160,6 @@ module Pikl
|
|
267
160
|
error("left is outside the range. #{x}") if x > self.width.to_i
|
268
161
|
error("top is outside the range. #{y}") if y > self.height.to_i
|
269
162
|
end
|
270
|
-
|
271
|
-
def validate_rotate(angle)
|
272
|
-
validate_numeric(angle)
|
273
|
-
error("invalid angle. # => #{angle}") unless ROTATE_ANGLE.has_key?(angle)
|
274
|
-
end
|
275
163
|
|
276
164
|
def validate_resize(width, height)
|
277
165
|
validate_auto(width, height)
|
@@ -307,6 +195,125 @@ module Pikl
|
|
307
195
|
#self.close
|
308
196
|
raise Pikl::ParameterException.new(message)
|
309
197
|
end
|
198
|
+
|
199
|
+
|
200
|
+
##--soezimaster add.
|
201
|
+
# オープン済みファイルディスクリプタからPiklを生成する
|
202
|
+
def fdopen(fd)
|
203
|
+
self.close
|
204
|
+
error("invalid parameter. # => #{fd}") unless fd.class.name == 'File'
|
205
|
+
@pkl_image = Ext.pkl_fdopen(fd)
|
206
|
+
end
|
207
|
+
|
208
|
+
# 複製
|
209
|
+
def dup(src)
|
210
|
+
self.close
|
211
|
+
error("invalid parameter. # => #{src}") unless src.class.name == 'Pikl::Image'
|
212
|
+
@pkl_image = Ext.pkl_dup(src.rawdata)
|
213
|
+
end
|
214
|
+
|
215
|
+
# 新規のキャンバスを作成する
|
216
|
+
def canvas(width, height, colorspace, color)
|
217
|
+
self.close
|
218
|
+
error("invalid parameter. # => #{color}") if color.nil?
|
219
|
+
error("invalid parameter. # => #{color}") if color.class.name != 'Pikl::Color'
|
220
|
+
error("invalid parameter. # => #{colorspace}") unless COLORSPACE.include?(colorspace)
|
221
|
+
validate_pix(width)
|
222
|
+
validate_pix(height)
|
223
|
+
@pkl_image = Ext.pkl_canvas(width, height, COLORSPACE[colorspace], color.rawdata)
|
224
|
+
end
|
225
|
+
|
226
|
+
# オープン済みファイルディスクリプタ(もしくはIO)にイメージを書き出す
|
227
|
+
def output(fd, format, compress=nil)
|
228
|
+
raise Pikl::ImageProcessException.new("image already closed.") unless @pkl_image
|
229
|
+
error("invalid parameter. # => #{fd}") unless ['File', 'IO'].include?(fd.class.name)
|
230
|
+
validate_format(format)
|
231
|
+
if compress
|
232
|
+
validate_compress(compress)
|
233
|
+
Ext.pkl_compress(@pkl_image, compress.to_i)
|
234
|
+
end
|
235
|
+
|
236
|
+
Ext.pkl_output(@pkl_image, fd, EXTENSIONS_FORMATS[format.to_s.downcase] || format.to_i)
|
237
|
+
self.close unless(@block)
|
238
|
+
@pkl_image
|
239
|
+
end
|
240
|
+
|
241
|
+
# 色数を数える
|
242
|
+
def count
|
243
|
+
Ext.pkl_count(@pkl_image) if(@pkl_image)
|
244
|
+
end
|
245
|
+
|
246
|
+
# カラースペースを返す
|
247
|
+
def colorspace
|
248
|
+
nil unless(@pkl_image)
|
249
|
+
COLORSPACE.find{ |k, v|
|
250
|
+
v == Ext.pkl_colorspace(@pkl_image)
|
251
|
+
return k
|
252
|
+
}
|
253
|
+
end
|
254
|
+
|
255
|
+
# 特定ピクセルの色を取り出す
|
256
|
+
def getcolor(x, y, colormodel)
|
257
|
+
nil unless(@pkl_image)
|
258
|
+
validate_position(x, y)
|
259
|
+
error("invalid parameter. # => #{colormodel}") unless COLORMODEL.include?(colormodel)
|
260
|
+
Ext.pkl_get_color(@pkl_image, x, y, COLORMODEL[colormodel])
|
261
|
+
end
|
262
|
+
|
263
|
+
# 特定ピクセルに色をセットする
|
264
|
+
def setcolor(x, y, colormodel, color)
|
265
|
+
nil unless(@pkl_image)
|
266
|
+
validate_position(x, y)
|
267
|
+
error("invalid parameter. # => #{colormodel}") unless COLORMODEL.include?(colormodel)
|
268
|
+
validate_numeric(color)
|
269
|
+
error("invalid parameter. # => #{color}") unless color>=0 && color<=255
|
270
|
+
Ext.pkl_set_color(@pkl_image, x, y, COLORMODEL[colormodel], color)
|
271
|
+
end
|
272
|
+
|
273
|
+
# 特定ピクセルの色を取り出す
|
274
|
+
def getpixel(x, y)
|
275
|
+
return unless @pkl_image
|
276
|
+
validate_position(x, y)
|
277
|
+
color = Ext.pkl_get_pixel(self.rawdata, x, y)
|
278
|
+
|
279
|
+
case self.colorspace
|
280
|
+
when :GRAY
|
281
|
+
v = { 'gray' => Ext.pkl_color(color, COLORMODEL[:gray]) }
|
282
|
+
when :RGB
|
283
|
+
v = {
|
284
|
+
'red' => Ext.pkl_color(color, COLORMODEL[:red]),
|
285
|
+
'green' => Ext.pkl_color(color, COLORMODEL[:green]),
|
286
|
+
'blue' => Ext.pkl_color(color, COLORMODEL[:blue]) }
|
287
|
+
when :CMYK
|
288
|
+
v = {
|
289
|
+
'cyan' => Ext.pkl_color(color, COLORMODEL[:cyan]),
|
290
|
+
'magenta' => Ext.pkl_color(color, COLORMODEL[:magenta]),
|
291
|
+
'yellow' => Ext.pkl_color(color, COLORMODEL[:yellow]),
|
292
|
+
'black' => Ext.pkl_color(color, COLORMODEL[:black]) }
|
293
|
+
else
|
294
|
+
v=nil
|
295
|
+
end
|
296
|
+
Ext.pkl_color_close(color)
|
297
|
+
return v
|
298
|
+
end
|
299
|
+
|
300
|
+
# 特定ピクセルに色を設定する
|
301
|
+
def setpixel(x, y, color, auto=true)
|
302
|
+
return unless @pkl_image
|
303
|
+
validate_position(x, y)
|
304
|
+
error("invalid parameter. # => #{color}") if color.nil?
|
305
|
+
error("invalid parameter. # => #{color}") if color.class.name != 'Pikl::Color'
|
306
|
+
Ext.pkl_set_pixel(@pkl_image, x, y, color.rawdata)
|
307
|
+
color.close if(auto)
|
308
|
+
end
|
309
|
+
|
310
|
+
def validate_position(x, y)
|
311
|
+
validate_numeric(x)
|
312
|
+
validate_numeric(y)
|
313
|
+
error("value is outside the range. #{x}") if x<0 || x>=self.width
|
314
|
+
error("value is outside the range. #{y}") if y<0 || y>=self.height
|
315
|
+
end
|
316
|
+
|
310
317
|
end
|
311
318
|
end
|
312
319
|
|
data/lib/pikl/version.rb
CHANGED
data/setup.rb
CHANGED
File without changes
|
data/test/sample.jpg
CHANGED
File without changes
|
data/test/test_helper.rb
CHANGED
File without changes
|
data/test/test_pikl_image.rb
CHANGED
@@ -313,20 +313,6 @@ class TestPiklImage < Test::Unit::TestCase
|
|
313
313
|
|
314
314
|
end
|
315
315
|
|
316
|
-
def test_validate_rotate
|
317
|
-
Pikl::Image.open(SAMPLE_IMAGE) do |img|
|
318
|
-
|
319
|
-
assert_raise(Pikl::ParameterException){img.validate_rotate(15)}
|
320
|
-
assert_nil(img.validate_rotate(0))
|
321
|
-
assert_nil(img.validate_rotate(90))
|
322
|
-
assert_nil(img.validate_rotate(180))
|
323
|
-
assert_nil(img.validate_rotate(270))
|
324
|
-
assert_nil(img.validate_rotate(360))
|
325
|
-
|
326
|
-
end
|
327
|
-
|
328
|
-
end
|
329
|
-
|
330
316
|
def test_validate_resize
|
331
317
|
Pikl::Image.open(SAMPLE_IMAGE) do |img|
|
332
318
|
|
@@ -0,0 +1,541 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestPiklImage < Test::Unit::TestCase
|
4
|
+
|
5
|
+
SAMPLE_IMAGE = File.dirname(__FILE__) + '/sample.jpg'
|
6
|
+
SAMPLE_OUTPUT = File.dirname(__FILE__) + '/output.jpg'
|
7
|
+
TESTOUT_DIR = File.dirname(__FILE__) + '/out'
|
8
|
+
|
9
|
+
SAMPLE_IMAGE_W = 120
|
10
|
+
SAMPLE_IMAGE_H = 160
|
11
|
+
|
12
|
+
def setup
|
13
|
+
#out�̉����������I
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
if File.exists? SAMPLE_OUTPUT
|
18
|
+
File.delete SAMPLE_OUTPUT
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def test_fdopen
|
24
|
+
assert_raise(Pikl::ParameterException){
|
25
|
+
f = "test"
|
26
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
27
|
+
pk.fdopen(f)
|
28
|
+
pk.close
|
29
|
+
}
|
30
|
+
|
31
|
+
f = open(SAMPLE_IMAGE, "rb")
|
32
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
33
|
+
pk.fdopen(f)
|
34
|
+
pk.save(TESTOUT_DIR + "/fdopen.jpg");
|
35
|
+
pk.close
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_dup
|
39
|
+
assert_raise(Pikl::ParameterException){
|
40
|
+
src = "test"
|
41
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
42
|
+
pk.dup(src)
|
43
|
+
pk.close
|
44
|
+
}
|
45
|
+
|
46
|
+
src = Pikl::Image.new(SAMPLE_IMAGE)
|
47
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
48
|
+
pk.dup(src)
|
49
|
+
src.close
|
50
|
+
pk.save(TESTOUT_DIR + "/dup.jpg");
|
51
|
+
pk.close
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_canvas
|
55
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
56
|
+
pk.canvas(100, 100, :GRAY, Pikl::Color.gray(100))
|
57
|
+
pk.save(TESTOUT_DIR + "/canvas_gray.jpg")
|
58
|
+
pk.close
|
59
|
+
|
60
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
61
|
+
pk.canvas(100, 100, :RGB, Pikl::Color.rgb(0xff, 0xff, 0xff))
|
62
|
+
pk.save(TESTOUT_DIR + "/canvas_rgb.jpg")
|
63
|
+
pk.close
|
64
|
+
|
65
|
+
pk = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
66
|
+
pk.canvas(100, 100, :CMYK, Pikl::Color.cmyk(0xff, 0, 0xff, 0xff))
|
67
|
+
pk.save(TESTOUT_DIR + "/canvas_cmyk.jpg")
|
68
|
+
pk.close
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_output
|
72
|
+
f = open(TESTOUT_DIR+'/output.jpg', "wb")
|
73
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
74
|
+
pk.output(f, pk.format)
|
75
|
+
#pk.output($stdout, pk.format)
|
76
|
+
pk.close
|
77
|
+
f.close
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_count
|
81
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
82
|
+
assert_equal(pk.count, 12979)
|
83
|
+
pk.close
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_colorspace
|
87
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
88
|
+
assert_equal(pk.colorspace, :RGB)
|
89
|
+
pk.close
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_getcolor
|
93
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
94
|
+
assert_equal(pk.getcolor(0, 0, :red), 207)
|
95
|
+
assert_equal(pk.getcolor(0, 0, :green), 206)
|
96
|
+
assert_equal(pk.getcolor(0, 0, :blue), 201)
|
97
|
+
pk.close
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_setcolor
|
101
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
102
|
+
for y in 0..100 do
|
103
|
+
for x in 0..100 do
|
104
|
+
pk.setcolor(x, y, :red, 255)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
pk.save(TESTOUT_DIR + "/setcolor.jpg")
|
108
|
+
pk.close
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_getpixel
|
112
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
113
|
+
color = pk.getpixel(0,0)
|
114
|
+
assert_equal(color['red'], 207)
|
115
|
+
assert_equal(color['green'], 206)
|
116
|
+
assert_equal(color['blue'], 201)
|
117
|
+
pk.close
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_setpixel
|
121
|
+
color = Pikl::Color.rgb(100,100,100)
|
122
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
123
|
+
for y in 0..100 do
|
124
|
+
for x in 0..100 do
|
125
|
+
pk.setpixel(x, y, color, false)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
pk.save(TESTOUT_DIR + "/setpixel.jpg")
|
129
|
+
pk.close
|
130
|
+
color.close
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_invert
|
134
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
135
|
+
pk.invert
|
136
|
+
pk.save(TESTOUT_DIR + "/invert.jpg")
|
137
|
+
pk.close
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_alphaedge
|
141
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
142
|
+
pk.alphaedge(8, 1.5, 1.5, 1.0, 30, 50)
|
143
|
+
pk.save(TESTOUT_DIR + "/alphaedge.jpg")
|
144
|
+
pk.close
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_crayon
|
148
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
149
|
+
pk.crayon
|
150
|
+
pk.save(TESTOUT_DIR + "/crayon.jpg")
|
151
|
+
pk.close
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_edgeposter
|
155
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
156
|
+
pk.edgeposter(4, 9.0, 9.0, 1.0, 1)
|
157
|
+
pk.save(TESTOUT_DIR + "/edgeposter.jpg")
|
158
|
+
pk.close
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_hydrangea
|
162
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
163
|
+
pk.hydrangea
|
164
|
+
pk.save(TESTOUT_DIR + "/hydrangea.jpg")
|
165
|
+
pk.close
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_rinkaku
|
169
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
170
|
+
pk.rinkaku
|
171
|
+
pk.save(TESTOUT_DIR + "/rinkaku.jpg")
|
172
|
+
pk.close
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_voronoi_zone
|
176
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
177
|
+
pk.voronoi_zone(5)
|
178
|
+
pk.save(TESTOUT_DIR + "/voronoi_zone.jpg")
|
179
|
+
pk.close
|
180
|
+
|
181
|
+
color = Pikl::Color.rgb(0, 0, 0)
|
182
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
183
|
+
pk.voronoi_zone(5, color)
|
184
|
+
pk.save(TESTOUT_DIR + "/voronoi_zone_edge.jpg")
|
185
|
+
pk.close
|
186
|
+
color.close
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_voronoi_count
|
191
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
192
|
+
pk.voronoi_count(300)
|
193
|
+
pk.save(TESTOUT_DIR + "/voronoi_count.jpg")
|
194
|
+
pk.close
|
195
|
+
|
196
|
+
color = Pikl::Color.rgb(0, 0, 0)
|
197
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
198
|
+
pk.voronoi_count(300, color)
|
199
|
+
pk.save(TESTOUT_DIR + "/voronoi_count_edge.jpg")
|
200
|
+
pk.close
|
201
|
+
color.close
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_sepia
|
205
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
206
|
+
pk.sepia(0.89, 0.8, 0.5)
|
207
|
+
pk.save(TESTOUT_DIR + "/sepia.jpg")
|
208
|
+
pk.close
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_oilpaint
|
212
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
213
|
+
pk.oilpaint(4)
|
214
|
+
pk.save(TESTOUT_DIR + "/oilpaint.jpg")
|
215
|
+
pk.close
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_kuwahara
|
219
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
220
|
+
pk.kuwahara(4)
|
221
|
+
pk.save(TESTOUT_DIR + "/kuwahara.jpg")
|
222
|
+
pk.close
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_blot
|
226
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
227
|
+
pk.blot(4)
|
228
|
+
pk.save(TESTOUT_DIR + "/blot.jpg")
|
229
|
+
pk.close
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_vtr
|
233
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
234
|
+
pk.vtr(3, 10, 10)
|
235
|
+
pk.save(TESTOUT_DIR + "/vtr.jpg")
|
236
|
+
pk.close
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_dither
|
240
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
241
|
+
pk.dither
|
242
|
+
pk.save(TESTOUT_DIR + "/dither.jpg")
|
243
|
+
pk.close
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_edgepaint
|
247
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
248
|
+
pk.edgepaint
|
249
|
+
pk.save(TESTOUT_DIR + "/edgepaint.jpg")
|
250
|
+
pk.close
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_edge
|
254
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
255
|
+
pk.edge
|
256
|
+
pk.save(TESTOUT_DIR + "/edge.jpg")
|
257
|
+
pk.close
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_contour
|
261
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
262
|
+
pk.contour
|
263
|
+
pk.save(TESTOUT_DIR + "/contour.jpg")
|
264
|
+
pk.close
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_focus
|
268
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
269
|
+
pk.focus
|
270
|
+
pk.save(TESTOUT_DIR + "/focus.jpg")
|
271
|
+
pk.close
|
272
|
+
end
|
273
|
+
|
274
|
+
def test_emboss
|
275
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
276
|
+
pk.emboss
|
277
|
+
pk.save(TESTOUT_DIR + "/emboss.jpg")
|
278
|
+
pk.close
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_custom_emboss
|
282
|
+
mask = [-1, -1, -1,
|
283
|
+
-1, 8, -1,
|
284
|
+
-1, -1, -1]
|
285
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
286
|
+
pk.emboss2(mask, 3, 3)
|
287
|
+
pk.save(TESTOUT_DIR + "/custom_emboss.jpg")
|
288
|
+
pk.close
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_noisecut
|
292
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
293
|
+
pk.noisecut
|
294
|
+
pk.save(TESTOUT_DIR + "/noisecut.jpg")
|
295
|
+
pk.close
|
296
|
+
end
|
297
|
+
|
298
|
+
def test_blur
|
299
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
300
|
+
pk.blur(3)
|
301
|
+
pk.save(TESTOUT_DIR + "/blur.jpg")
|
302
|
+
pk.close
|
303
|
+
|
304
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
305
|
+
pk.gaussblur(3.0)
|
306
|
+
pk.save(TESTOUT_DIR + "/gaussblur.jpg")
|
307
|
+
pk.close
|
308
|
+
|
309
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
310
|
+
pk.rblur
|
311
|
+
pk.save(TESTOUT_DIR + "/rblur.jpg")
|
312
|
+
pk.close
|
313
|
+
|
314
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
315
|
+
pk.ablur
|
316
|
+
pk.save(TESTOUT_DIR + "/ablur.jpg")
|
317
|
+
pk.close
|
318
|
+
|
319
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
320
|
+
pk.wblur
|
321
|
+
pk.save(TESTOUT_DIR + "/wblur.jpg")
|
322
|
+
pk.close
|
323
|
+
|
324
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
325
|
+
pk.mblur(30.0, 5)
|
326
|
+
pk.save(TESTOUT_DIR + "/mblur.jpg")
|
327
|
+
pk.close
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_shadowframe
|
331
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
332
|
+
pk.shadowframe(10)
|
333
|
+
pk.save(TESTOUT_DIR + "/shadowframe.jpg")
|
334
|
+
pk.close
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_randomshadow
|
338
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
339
|
+
|
340
|
+
canvas = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
341
|
+
canvas.canvas(300, 300, :RGB, Pikl::Color.rgb(0xff, 0xff, 0xff))
|
342
|
+
|
343
|
+
canvas.randomshadow(pk, 100, 100, 10)
|
344
|
+
canvas.randomshadow(pk, 50, 50, 10)
|
345
|
+
canvas.randomshadow(pk, 0, 0, 10)
|
346
|
+
|
347
|
+
canvas.save(TESTOUT_DIR + "/randomshadow.jpg")
|
348
|
+
canvas.close
|
349
|
+
pk.close
|
350
|
+
end
|
351
|
+
|
352
|
+
|
353
|
+
def test_color_emboss
|
354
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
355
|
+
pk.color_emboss(100, 70)
|
356
|
+
pk.save(TESTOUT_DIR + "/color_emboss.jpg")
|
357
|
+
pk.close
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_pixelate
|
361
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
362
|
+
pk.pixelate(2)
|
363
|
+
pk.save(TESTOUT_DIR + "/pixelate.jpg")
|
364
|
+
pk.close
|
365
|
+
end
|
366
|
+
|
367
|
+
def test_grid
|
368
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
369
|
+
pk.grid(5, 5, 100)
|
370
|
+
pk.save(TESTOUT_DIR + "/grid.jpg")
|
371
|
+
pk.close
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_posterize
|
375
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
376
|
+
pk.posterize(8)
|
377
|
+
pk.save(TESTOUT_DIR + "/posterize.jpg")
|
378
|
+
pk.close
|
379
|
+
end
|
380
|
+
|
381
|
+
def test_cutcolor
|
382
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
383
|
+
pk.cutcolor(0b10101100)
|
384
|
+
pk.save(TESTOUT_DIR + "/cutcolor.jpg")
|
385
|
+
pk.close
|
386
|
+
end
|
387
|
+
|
388
|
+
def test_gray
|
389
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
390
|
+
pk.gray
|
391
|
+
pk.save(TESTOUT_DIR + "/gray.jpg")
|
392
|
+
pk.close
|
393
|
+
|
394
|
+
pk = Pikl::Image.new(TESTOUT_DIR + "/gray.jpg")
|
395
|
+
pk.blackwhite
|
396
|
+
pk.save(TESTOUT_DIR + "/blackwhite.jpg")
|
397
|
+
pk.close
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_tileslit
|
401
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
402
|
+
pk.tileslit(10,5)
|
403
|
+
pk.save(TESTOUT_DIR + "/tileslit.jpg")
|
404
|
+
pk.close
|
405
|
+
end
|
406
|
+
|
407
|
+
def test_splitframe
|
408
|
+
color = Pikl::Color.rgb(200,100,255)
|
409
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
410
|
+
pk.splitframe(color, 5, 5, 3, 2)
|
411
|
+
pk.save(TESTOUT_DIR + "/splitframe.jpg")
|
412
|
+
pk.close
|
413
|
+
end
|
414
|
+
|
415
|
+
def test_vignette
|
416
|
+
color = Pikl::Color.rgb(0,0,0)
|
417
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
418
|
+
pk.vignette(color, 50, 80)
|
419
|
+
pk.save(TESTOUT_DIR + "/vignette.jpg")
|
420
|
+
pk.close
|
421
|
+
color.close
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_vaseline
|
425
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
426
|
+
pk.vaseline(80)
|
427
|
+
pk.save(TESTOUT_DIR + "/vaseline.jpg")
|
428
|
+
pk.close
|
429
|
+
end
|
430
|
+
|
431
|
+
def test_vv
|
432
|
+
color = Pikl::Color.rgb(0,0,0)
|
433
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
434
|
+
pk.vv(color, 50, 80)
|
435
|
+
pk.save(TESTOUT_DIR + "/vv.jpg")
|
436
|
+
pk.close
|
437
|
+
color.close
|
438
|
+
end
|
439
|
+
|
440
|
+
def test_film
|
441
|
+
color = Pikl::Color.rgb(200,100,150)
|
442
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
443
|
+
pk.film(color, 30)
|
444
|
+
pk.save(TESTOUT_DIR + "/film.jpg")
|
445
|
+
pk.close
|
446
|
+
color.close
|
447
|
+
end
|
448
|
+
|
449
|
+
def test_swirl
|
450
|
+
color = Pikl::Color.rgb(200,100,150)
|
451
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
452
|
+
pk.swirl(0.005, -1, -1, color)
|
453
|
+
pk.save(TESTOUT_DIR + "/swirl.jpg")
|
454
|
+
pk.close
|
455
|
+
color.close
|
456
|
+
end
|
457
|
+
|
458
|
+
def test_wave
|
459
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
460
|
+
pk.wave(15.0, 5.0)
|
461
|
+
pk.save(TESTOUT_DIR + "/wave.jpg")
|
462
|
+
pk.close
|
463
|
+
end
|
464
|
+
|
465
|
+
def test_dots
|
466
|
+
color = Pikl::Color.rgb(200,100,150)
|
467
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
468
|
+
pk.dots(3, color)
|
469
|
+
pk.save(TESTOUT_DIR + "/dots.jpg")
|
470
|
+
pk.close
|
471
|
+
color.close
|
472
|
+
end
|
473
|
+
|
474
|
+
def test_colordither
|
475
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
476
|
+
pk.colordither(50)
|
477
|
+
pk.save(TESTOUT_DIR + "/colordither.jpg")
|
478
|
+
pk.close
|
479
|
+
end
|
480
|
+
|
481
|
+
def test_fantasy
|
482
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
483
|
+
pk.fantasy(1, 0.5, 1.0, 0)
|
484
|
+
pk.save(TESTOUT_DIR + "/fantasy.jpg")
|
485
|
+
pk.close
|
486
|
+
end
|
487
|
+
|
488
|
+
def test_illust
|
489
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
490
|
+
pk.illust(50,20,50)
|
491
|
+
pk.save(TESTOUT_DIR + "/illust.jpg")
|
492
|
+
pk.close
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_pattern
|
496
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
497
|
+
pk.pattern(3,9)
|
498
|
+
pk.save(TESTOUT_DIR + "/pattern.jpg")
|
499
|
+
pk.close
|
500
|
+
end
|
501
|
+
|
502
|
+
def test_tile
|
503
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
504
|
+
pk.tile(5,5,50)
|
505
|
+
pk.save(TESTOUT_DIR + "/tile.jpg")
|
506
|
+
pk.close
|
507
|
+
end
|
508
|
+
|
509
|
+
def test_affine
|
510
|
+
color = Pikl::Color.rgb(200,100,150)
|
511
|
+
pk = Pikl::Image.new(SAMPLE_IMAGE)
|
512
|
+
pk.affine(300, 300, color, 2.0, 2.0, 30.0, 50, 50)
|
513
|
+
pk.save(TESTOUT_DIR + "/affine.jpg")
|
514
|
+
pk.close
|
515
|
+
color.close
|
516
|
+
end
|
517
|
+
|
518
|
+
|
519
|
+
def test_special
|
520
|
+
Pikl::Image.open(SAMPLE_IMAGE) do |img|
|
521
|
+
img.posterize(8)
|
522
|
+
img.noisecut
|
523
|
+
|
524
|
+
img2 = Pikl::Image.new(Pikl::DEFAULT_IMAGE)
|
525
|
+
img2.dup(img)
|
526
|
+
img2.level(5.0, 5.0, 1.0)
|
527
|
+
|
528
|
+
img.brightness(50)
|
529
|
+
img.edge(30)
|
530
|
+
|
531
|
+
img.alphablend(img2, 0, 0, 70)
|
532
|
+
|
533
|
+
img.save(TESTOUT_DIR + "/special.jpg")
|
534
|
+
img.close
|
535
|
+
img2.close
|
536
|
+
end
|
537
|
+
end
|
538
|
+
|
539
|
+
end
|
540
|
+
|
541
|
+
|