free-image 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/HISTORY +5 -0
- data/LICENSE +21 -0
- data/README.rdoc +99 -0
- data/Rakefile +47 -0
- data/cookbook.rdoc +239 -0
- data/free-image.gemspec +30 -0
- data/lib/free-image.rb +101 -0
- data/lib/free-image/bitmap.rb +154 -0
- data/lib/free-image/enums/color_types.rb +24 -0
- data/lib/free-image/enums/dithers.rb +24 -0
- data/lib/free-image/enums/filters.rb +12 -0
- data/lib/free-image/enums/formats.rb +84 -0
- data/lib/free-image/enums/image_types.rb +36 -0
- data/lib/free-image/errors.rb +44 -0
- data/lib/free-image/modules/conversions.rb +166 -0
- data/lib/free-image/modules/helper.rb +42 -0
- data/lib/free-image/modules/icc.rb +41 -0
- data/lib/free-image/modules/information.rb +305 -0
- data/lib/free-image/modules/modify.rb +261 -0
- data/lib/free-image/modules/pixels.rb +135 -0
- data/lib/free-image/modules/transforms.rb +83 -0
- data/lib/free-image/palette.rb +44 -0
- data/lib/free-image/scanline.rb +151 -0
- data/lib/free-image/sources/abstract_source.rb +172 -0
- data/lib/free-image/sources/file.rb +115 -0
- data/lib/free-image/sources/io.rb +154 -0
- data/lib/free-image/sources/memory.rb +189 -0
- data/lib/free-image/types/boolean.rb +14 -0
- data/lib/free-image/types/complex.rb +9 -0
- data/lib/free-image/types/ffi.rb +14 -0
- data/lib/free-image/types/rgb16.rb +11 -0
- data/lib/free-image/types/rgb_quad.rb +82 -0
- data/lib/free-image/types/rgb_triple.rb +42 -0
- data/lib/free-image/types/rgba16.rb +12 -0
- data/lib/free-image/types/rgbaf.rb +12 -0
- data/lib/free-image/types/rgbf.rb +11 -0
- data/test/cookbook.rb +46 -0
- data/test/images/gradient.png +0 -0
- data/test/images/lena.png +0 -0
- data/test/images/lena.tiff +0 -0
- data/test/images/lena_flipped.png +0 -0
- data/test/images/lena_rescale_bicubic.png +0 -0
- data/test/images/lena_rescale_bilinear.png +0 -0
- data/test/images/lena_rescale_box.png +0 -0
- data/test/images/lena_rescale_bspline.png +0 -0
- data/test/images/lena_rescale_catmullrom.png +0 -0
- data/test/images/lena_rescale_lanczos3.png +0 -0
- data/test/images/lena_rotate_45.png +0 -0
- data/test/images/lena_rotate_ex_45_masked.png +0 -0
- data/test/images/lena_rotate_ex_45_mirrored.png +0 -0
- data/test/images/lena_rotate_ex_45_top_left.png +0 -0
- data/test/images/lena_thumbnail.png +0 -0
- data/test/images/lena_thumbnail_border_enlarge.png +0 -0
- data/test/images/lena_thumbnail_border_paste.png +0 -0
- data/test/images/lena_thumbnail_border_scanline.png +0 -0
- data/test/images/not_an_image.txt +0 -0
- data/test/images/sample.png +0 -0
- data/test/images/sample_composite_color.png +0 -0
- data/test/test_bitmap.rb +43 -0
- data/test/test_conversions.rb +86 -0
- data/test/test_file.rb +51 -0
- data/test/test_free_image.rb +15 -0
- data/test/test_helper.rb +35 -0
- data/test/test_information.rb +118 -0
- data/test/test_io.rb +53 -0
- data/test/test_memory.rb +65 -0
- data/test/test_modify.rb +59 -0
- data/test/test_palette.rb +45 -0
- data/test/test_pixels.rb +62 -0
- data/test/test_rgb_quad.rb +26 -0
- data/test/test_scanline.rb +65 -0
- data/test/test_suite.rb +19 -0
- data/test/test_transforms.rb +30 -0
- metadata +169 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class FreeImageTest < Test::Unit::TestCase
|
7
|
+
def test_copyright
|
8
|
+
assert_equal("This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details",
|
9
|
+
FreeImage.copyright)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_version
|
13
|
+
assert_equal("3.15.1", FreeImage.version)
|
14
|
+
end
|
15
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# To make testing/debugging easier, test within this source tree versus an installed gem
|
4
|
+
dir = File.dirname(__FILE__)
|
5
|
+
ROOT_DIR = File.expand_path(File.join(dir, '..'))
|
6
|
+
LIB_DIR = File.expand_path(File.join(ROOT_DIR, 'lib'))
|
7
|
+
|
8
|
+
$LOAD_PATH << LIB_DIR
|
9
|
+
|
10
|
+
require 'rubygems'
|
11
|
+
require 'free-image'
|
12
|
+
require 'tempfile'
|
13
|
+
|
14
|
+
def image_path(image)
|
15
|
+
File.join(ROOT_DIR, 'test', 'images', image)
|
16
|
+
end
|
17
|
+
|
18
|
+
def image_data(image)
|
19
|
+
path = File.join(ROOT_DIR, 'test', 'images', image)
|
20
|
+
result = nil
|
21
|
+
File.open(path, 'rb') do |file|
|
22
|
+
result = file.read
|
23
|
+
end
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
def sample_image
|
28
|
+
path = File.join(ROOT_DIR, 'test', 'images', 'sample.png')
|
29
|
+
FreeImage::Bitmap.open(path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def lena_image
|
33
|
+
path = File.join(ROOT_DIR, 'test', 'images', 'lena.png')
|
34
|
+
FreeImage::Bitmap.open(path)
|
35
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class InformationTest < Test::Unit::TestCase
|
7
|
+
def test_background_color
|
8
|
+
background_color = sample_image.background_color
|
9
|
+
assert_kind_of(FreeImage::RGBQuad, background_color)
|
10
|
+
assert_equal(112, background_color[:red])
|
11
|
+
assert_equal(176, background_color[:green])
|
12
|
+
assert_equal(240, background_color[:blue])
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_background_color_set
|
16
|
+
image = sample_image
|
17
|
+
rgb = FreeImage::RGBQuad.create(7, 8, 9)
|
18
|
+
|
19
|
+
image.background_color = rgb
|
20
|
+
background_color = image.background_color
|
21
|
+
assert_equal(rgb, background_color)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_bits_per_pixel
|
25
|
+
assert_equal(8, sample_image.bits_per_pixel)
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_blue_mask
|
29
|
+
assert_equal(0, sample_image.blue_mask)
|
30
|
+
assert_equal(FreeImage::RGBQuad::BLUE_MASK, lena_image.blue_mask)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_color_type
|
34
|
+
assert_equal(:palette, sample_image.color_type)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_dib_size
|
38
|
+
assert_equal(52664, sample_image.dib_size)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_dots_per_meter_x
|
42
|
+
assert_equal(2835, sample_image.dots_per_meter_x)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_dots_per_meter_x_set
|
46
|
+
image = sample_image
|
47
|
+
image.dots_per_meter_x = 3000
|
48
|
+
assert_equal(3000, image.dots_per_meter_x)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_dots_per_meter_y
|
52
|
+
assert_equal(2835, sample_image.dots_per_meter_y)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_dots_per_meter_y_set
|
56
|
+
image = sample_image
|
57
|
+
image.dots_per_meter_y = 4000
|
58
|
+
assert_equal(4000, image.dots_per_meter_y)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_green_mask
|
62
|
+
assert_equal(0, sample_image.green_mask)
|
63
|
+
assert_equal(FreeImage::RGBQuad::GREEN_MASK, lena_image.green_mask)
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_has_background_color
|
67
|
+
assert(sample_image.has_background_color)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_has_pixels
|
71
|
+
assert(sample_image.has_pixels)
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_height
|
75
|
+
assert_equal(215, sample_image.height)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_image_type
|
79
|
+
assert_equal(:bitmap, sample_image.image_type)
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_line
|
83
|
+
assert_equal(240, sample_image.line)
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_pitch
|
87
|
+
assert_equal(240, sample_image.pitch)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_red_mask
|
91
|
+
assert_equal(0, sample_image.red_mask)
|
92
|
+
assert_equal(FreeImage::RGBQuad::RED_MASK, lena_image.red_mask)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_transparent
|
96
|
+
assert(sample_image.transparent)
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_transparent_set
|
100
|
+
image = sample_image
|
101
|
+
image.transparent = false
|
102
|
+
assert(!image.transparent)
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_transparent_index
|
106
|
+
assert_equal(6, sample_image.transparent_index)
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_transparent_index_set
|
110
|
+
image = sample_image
|
111
|
+
image.transparent_index = 4
|
112
|
+
assert_equal(4, image.transparent_index)
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_width
|
116
|
+
assert_equal(240, sample_image.width)
|
117
|
+
end
|
118
|
+
end
|
data/test/test_io.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class IoTest < Test::Unit::TestCase
|
7
|
+
def io(image = 'sample.png')
|
8
|
+
path = image_path(image)
|
9
|
+
file = File.open(path)
|
10
|
+
FreeImage::IO.new(file)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_format
|
14
|
+
assert_equal(:png, io.format)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_format_unknown
|
18
|
+
assert_equal(:unknown, io('not_an_image.txt').format)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_load
|
22
|
+
bitmap = io.open
|
23
|
+
assert_kind_of(FreeImage::Bitmap, bitmap)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_load_unknown
|
27
|
+
error = assert_raise(FreeImage::Error) do
|
28
|
+
io('not_an_image.txt').open
|
29
|
+
end
|
30
|
+
assert_equal("Cannot load :unknown image format",
|
31
|
+
error.message)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_load_wrong_format
|
35
|
+
error = assert_raise(FreeImage::Error) do
|
36
|
+
io.open(:jpeg)
|
37
|
+
end
|
38
|
+
assert_equal("Not a JPEG file: starts with 0x89 0x50", error.to_s)
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_save
|
42
|
+
tmp_file = Tempfile.new('test_free_image')
|
43
|
+
dst = FreeImage::IO.new(tmp_file)
|
44
|
+
|
45
|
+
bitmap = io.open
|
46
|
+
result = bitmap.save(dst, :png)
|
47
|
+
assert(result)
|
48
|
+
assert(File.exists?(tmp_file))
|
49
|
+
ensure
|
50
|
+
tmp_file.close
|
51
|
+
tmp_file.unlink
|
52
|
+
end
|
53
|
+
end
|
data/test/test_memory.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class MemoryTest < Test::Unit::TestCase
|
7
|
+
def memory(image = 'sample.png')
|
8
|
+
data = image_data(image)
|
9
|
+
FreeImage::Memory.new(data)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_wrap
|
13
|
+
assert_not_nil(memory)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_format
|
17
|
+
assert_equal(:png, memory.format)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_format_unknown
|
21
|
+
assert_equal(:unknown, memory('not_an_image.txt').format)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_load
|
25
|
+
bitmap = memory.open
|
26
|
+
assert_kind_of(FreeImage::Bitmap, bitmap)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_load_unknown
|
30
|
+
error = assert_raise(FreeImage::Error) do
|
31
|
+
memory('not_an_image.txt').open
|
32
|
+
end
|
33
|
+
assert_equal("Cannot load :unknown image format",
|
34
|
+
error.message)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_load_wrong_format
|
38
|
+
error = assert_raise(FreeImage::Error) do
|
39
|
+
memory.open(:jpeg, 0)
|
40
|
+
end
|
41
|
+
assert_equal("Not a JPEG file: starts with 0x89 0x50", error.to_s)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_bytes
|
45
|
+
bitmap1 = FreeImage::Bitmap.open(image_path('sample.png'))
|
46
|
+
|
47
|
+
memory = FreeImage::Memory.new(image_data('sample.png'))
|
48
|
+
bitmap2 = memory.open
|
49
|
+
|
50
|
+
assert_equal(bitmap1.bits, bitmap2.bits)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_save
|
54
|
+
dst = FreeImage::Memory.new
|
55
|
+
|
56
|
+
bitmap = memory.open
|
57
|
+
result = bitmap.save(dst, :png)
|
58
|
+
|
59
|
+
assert(result)
|
60
|
+
assert_not_nil(dst.memory.bytes)
|
61
|
+
if defined?(Encoding)
|
62
|
+
assert_equal(dst.memory.bytes.encoding, Encoding::BINARY)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/test/test_modify.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class ModifyTest < Test::Unit::TestCase
|
7
|
+
def test_copy
|
8
|
+
bitmap1 = FreeImage::Bitmap.open(image_path('sample.png'))
|
9
|
+
bitmap2 = bitmap1.copy(0, 0, 50, 60)
|
10
|
+
|
11
|
+
assert_kind_of(FreeImage::Bitmap, bitmap2)
|
12
|
+
assert_equal(50, bitmap2.width)
|
13
|
+
assert_equal(60, bitmap2.height)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_expand_canvas
|
17
|
+
bitmap = FreeImage::Bitmap.open(image_path('sample.png'))
|
18
|
+
color = FreeImage::RGBQuad.create(15, 30, 45)
|
19
|
+
|
20
|
+
result = bitmap.enlarge_canvas(1, 1, 1, 1, color)
|
21
|
+
assert_kind_of(FreeImage::Bitmap, result)
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_fill_background
|
25
|
+
bitmap = FreeImage::Bitmap.open(image_path('sample.png'))
|
26
|
+
color = FreeImage::RGBQuad.create(15, 30, 45)
|
27
|
+
|
28
|
+
result = bitmap.fill_background!(color)
|
29
|
+
assert(result)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_paste
|
33
|
+
bitmap1 = FreeImage::Bitmap.open(image_path('sample.png'))
|
34
|
+
bitmap2 = FreeImage::Bitmap.open(image_path('sample.png'))
|
35
|
+
result = bitmap1.paste!(bitmap2, 0, 0, 0.5)
|
36
|
+
|
37
|
+
assert_kind_of(TrueClass, result)
|
38
|
+
assert_equal(240, bitmap2.width)
|
39
|
+
assert_equal(215, bitmap2.height)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_rescale
|
43
|
+
bitmap1 = FreeImage::Bitmap.open(image_path('sample.png'))
|
44
|
+
bitmap2 = bitmap1.rescale(120, 100, :box)
|
45
|
+
|
46
|
+
assert_kind_of(FreeImage::Bitmap, bitmap2)
|
47
|
+
assert_equal(120, bitmap2.width)
|
48
|
+
assert_equal(100, bitmap2.height)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_thumbnail
|
52
|
+
bitmap1 = FreeImage::Bitmap.open(image_path('sample.png'))
|
53
|
+
bitmap2 = bitmap1.make_thumbnail(100)
|
54
|
+
|
55
|
+
assert_kind_of(FreeImage::Bitmap, bitmap2)
|
56
|
+
assert_equal(100, bitmap2.width)
|
57
|
+
assert_equal(90, bitmap2.height)
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class PaletteTest < Test::Unit::TestCase
|
7
|
+
def test_palette
|
8
|
+
palette = sample_image.palette
|
9
|
+
assert_not_nil(palette)
|
10
|
+
assert_kind_of(FreeImage::Palette, palette)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_size
|
14
|
+
palette = sample_image.palette
|
15
|
+
assert_equal(256, palette.size)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_index
|
19
|
+
palette = sample_image.palette
|
20
|
+
rgb = palette[27]
|
21
|
+
|
22
|
+
assert_kind_of(FreeImage::RGBQuad, rgb)
|
23
|
+
assert_equal(201, rgb[:red])
|
24
|
+
assert_equal(253, rgb[:green])
|
25
|
+
assert_equal(0, rgb[:blue])
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_index_too_small
|
29
|
+
palette = sample_image.palette
|
30
|
+
|
31
|
+
error = assert_raise(RangeError) do
|
32
|
+
palette[-1]
|
33
|
+
end
|
34
|
+
assert_equal("Value is out of range 0..256. Value: -1", error.message)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_index_too_large
|
38
|
+
palette = sample_image.palette
|
39
|
+
|
40
|
+
error = assert_raise(RangeError) do
|
41
|
+
palette[300]
|
42
|
+
end
|
43
|
+
assert_equal("Value is out of range 0..256. Value: 300", error.message)
|
44
|
+
end
|
45
|
+
end
|
data/test/test_pixels.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require './test_helper'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
class PixelTest < Test::Unit::TestCase
|
7
|
+
def test_bits
|
8
|
+
bytes = sample_image.bits
|
9
|
+
assert_not_nil(bytes)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_pixel_index
|
13
|
+
index = sample_image.pixel_index(0, 0)
|
14
|
+
assert_equal(113, index)
|
15
|
+
|
16
|
+
index = lena_image.pixel_index(0, 0)
|
17
|
+
assert_nil(index)
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_set_pixel_index
|
21
|
+
image = sample_image
|
22
|
+
result = image.set_pixel_index(0, 0, 14)
|
23
|
+
assert(result)
|
24
|
+
|
25
|
+
index = image.pixel_index(0, 0)
|
26
|
+
assert_equal(14, index)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_set_pixel_invalid
|
30
|
+
image = lena_image
|
31
|
+
result = image.set_pixel_index(0, 0, 14)
|
32
|
+
assert(!result)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_pixel_color
|
36
|
+
color = lena_image.pixel_color(0, 0)
|
37
|
+
assert_kind_of(FreeImage::RGBQuad, color)
|
38
|
+
|
39
|
+
color = sample_image.pixel_color(0, 0)
|
40
|
+
assert_nil(color)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_set_pixel_color
|
44
|
+
image = lena_image
|
45
|
+
|
46
|
+
color1 = FreeImage::RGBQuad.create(0, 0, 255)
|
47
|
+
result = image.set_pixel_color(0, 0, color1)
|
48
|
+
assert(result)
|
49
|
+
|
50
|
+
color2 = image.pixel_color(0, 0)
|
51
|
+
assert_equal(color1, color2)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_set_pixel_invalid
|
55
|
+
# Pixel colors aren't supported on paletted images
|
56
|
+
image = sample_image
|
57
|
+
|
58
|
+
color1 = FreeImage::RGBQuad.create(0, 0, 255)
|
59
|
+
result = image.set_pixel_color(0, 0, color1)
|
60
|
+
assert(!result)
|
61
|
+
end
|
62
|
+
end
|