free-image 0.6.2 → 0.7.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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/HISTORY +30 -19
  3. data/LICENSE +20 -20
  4. data/README.rdoc +120 -120
  5. data/Rakefile +51 -47
  6. data/cookbook.rdoc +248 -237
  7. data/free-image.gemspec +30 -29
  8. data/lib/free-image.rb +1 -2
  9. data/lib/free-image/bitmap.rb +2 -2
  10. data/lib/free-image/enums/filters.rb +11 -11
  11. data/lib/free-image/errors.rb +43 -43
  12. data/lib/free-image/modules/conversions.rb +253 -253
  13. data/lib/free-image/modules/helper.rb +41 -41
  14. data/lib/free-image/modules/information.rb +20 -2
  15. data/lib/free-image/modules/modify.rb +299 -299
  16. data/lib/free-image/modules/pixels.rb +134 -134
  17. data/lib/free-image/modules/transforms.rb +90 -90
  18. data/lib/free-image/sources/abstract_source.rb +178 -178
  19. data/lib/free-image/sources/file.rb +114 -114
  20. data/lib/free-image/sources/io.rb +153 -153
  21. data/lib/free-image/sources/memory.rb +188 -188
  22. data/lib/free-image/types/boolean.rb +13 -13
  23. data/lib/free-image/types/ffi.rb +13 -13
  24. data/lib/free-image/types/info_header.rb +36 -0
  25. data/lib/free-image/types/rgb16.rb +31 -0
  26. data/test/cookbook.rb +45 -46
  27. data/test/images/sample_composite.png +0 -0
  28. data/test/images/test16.bmp +0 -0
  29. data/test/images/test16bf555.bmp +0 -0
  30. data/test/images/test16bf565.bmp +0 -0
  31. data/test/test_bitmap.rb +61 -63
  32. data/test/test_conversions.rb +85 -86
  33. data/test/test_file.rb +68 -69
  34. data/test/test_free_image.rb +14 -15
  35. data/test/test_helper.rb +14 -0
  36. data/test/test_information.rb +145 -117
  37. data/test/test_io.rb +73 -74
  38. data/test/test_memory.rb +83 -84
  39. data/test/test_modify.rb +75 -58
  40. data/test/test_palette.rb +44 -45
  41. data/test/test_pixels.rb +61 -62
  42. data/test/test_rgb_quad.rb +24 -25
  43. data/test/test_scanline.rb +64 -65
  44. data/test/test_suite.rb +12 -17
  45. data/test/test_transforms.rb +28 -29
  46. metadata +58 -31
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9ebfb83c042b8dc13d9284759db6aaafb51f706d
4
+ data.tar.gz: 94a96105ad584b3a77175d2a91d997316cc303bb
5
+ SHA512:
6
+ metadata.gz: 7e468e23c9918e0bebe109220e49c563277d700fc5a10d4e924a0042ae32900117e28817388dd95c48fb55659764749eb65ccc6ecaf567afa2f316d6c1380940
7
+ data.tar.gz: bfd559ca4e30420bf107711e3e96258e6287531407810786844ff31a00e76b1b84381eea461a71a33686b09f9e2d00cd19eaa2d633703cc69e35dfc7f86e284b
data/HISTORY CHANGED
@@ -1,20 +1,31 @@
1
- = Release History
2
-
3
- == 0.6.2 / 2011-09-06 Charlie Savage
4
-
5
- * Add null pointer checks when loading images
6
- * Add null pointer check when creating a new image
7
-
8
- == 0.6.1 / 2011-09-06 Charlie Savage
9
-
10
- * Use release version on windows of FreeImage, not debug version.
11
-
12
- == 0.6.0 / 2011-09-02 Charlie Savage
13
-
14
- * Update documentation
15
- * Add alternate library names
16
- * Add support for blocks in all methods that return bitmaps
17
-
18
- == 0.5.0 / 2011-08-28 Charlie Savage
19
-
1
+ = Release History
2
+
3
+ == 0.7.0 / 2015-10-10
4
+ * Add test and example for compositing images (Charlie Savage)
5
+ * Specify freeimage version requirement (Charlie Savage)
6
+ * Fix up failing tests and test with FreeImage version 3.17.0 (Charlie Savage)
7
+ * Fix flip_vertical! to flip vertically, not horizontally (Chris Howlett)
8
+ * No rgb mask stored in modern FreeImage unless using BI_BITFIELDS in 16 bit BMP (Benjamin Armintor)
9
+ * Ruby object_id is a 32-bit value (Benjamin Armintor)
10
+ * Fix C type translation for bytes on osx/intel (Benjamin Armintor)
11
+ * Test suite clean up (Benjamin Armintor)
12
+ * Minor documentation updates (Charlie Savage)
13
+
14
+ == 0.6.2 / 2011-09-06
15
+
16
+ * Add null pointer checks when loading images
17
+ * Add null pointer check when creating a new image
18
+
19
+ == 0.6.1 / 2011-09-06
20
+
21
+ * Use release version on windows of FreeImage, not debug version.
22
+
23
+ == 0.6.0 / 2011-09-02
24
+
25
+ * Update documentation
26
+ * Add alternate library names
27
+ * Add support for blocks in all methods that return bitmaps
28
+
29
+ == 0.5.0 / 2011-08-28 Charlie Savage
30
+
20
31
  * Initial Commit
data/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- Copyright (c) 2008-2011 Charlie Savage and contributors
2
- Copyright (c) 2002-2007 Sean Chittenden and contributors
3
- Copyright (c) 2001 Wai-Sun "Squidster" Chia
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of
6
- this software and associated documentation files (the "Software"), to deal in
7
- the Software without restriction, including without limitation the rights to
8
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
- of the Software, and to permit persons to whom the Software is furnished to do
10
- so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ Copyright (c) 2008-2011 Charlie Savage and contributors
2
+ Copyright (c) 2002-2007 Sean Chittenden and contributors
3
+ Copyright (c) 2001 Wai-Sun "Squidster" Chia
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9
+ of the Software, and to permit persons to whom the Software is furnished to do
10
+ so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
@@ -1,120 +1,120 @@
1
- = FreeImage Ruby Bindings
2
-
3
- == Overview
4
- The free-image gem provides Ruby language bindings for the
5
- FreeImage[http://freeimage.sourceforge.net/] library. It is free software,
6
- released under the MIT License.
7
-
8
- FreeImage is an light-weight, open source image manipulation library that
9
- supports many popular graphics image {formats}[rdoc-ref:FreeImage.formats]
10
- such as PNG, JPEG, GIF, BMP, and TIFF.
11
-
12
- We think FreeImage is a great library for applications that need to read, write,
13
- create and modify images and thumbnails because:
14
-
15
- * Its easy to use
16
- * Its supports almost all popular image formats
17
- * Its a light-weight alternative to larger libraries such as ImageMagick,
18
- supporting basic manipulation functions but not advanced functionality
19
- * Its cross-platform
20
- * The ruby bindings are implemented using FFI, so work across all Ruby
21
- implementations and do not have to be compiled
22
- * Its much more comprehensive than ImageScience
23
- * Has comprehensive documentation
24
-
25
- Note that FreeImage is not the right library for you if you need:
26
- * Advanced image processing operations such as convolution and transforms
27
- * Bitmap drawing
28
- * Vector graphics
29
-
30
- == Installation
31
- free-image requires Ruby 1.8.7 or higher. The easiest way to install
32
- free-image is via Ruby Gems. To install:
33
-
34
- gem install free-image
35
-
36
- == Getting Started
37
- Getting started is easy - first work through the examples in the cookbook[rdoc-ref:cookbook.rdoc].
38
- Once you've done that, the refer to rdocs for extensive documentation.
39
-
40
- == Memory Management
41
- Opening and working with images consumes some memory. Generally you won't have to
42
- worry about this. When an image goes out of scope, it will be garbage collected
43
- and the underlying image memory will be freed.
44
-
45
- Having said that, \FreeImage also lets you control when the memory is freed.
46
- Any method that creates a new image also takes a block. When the block finishes,
47
- the underlying image memory is freed. This works the same way as the File.open
48
- method. For example:
49
-
50
- FreeImage::Bitmap.open('images/lena.png') do |image|
51
- thumbnail = image.make_thumbail do |thumbail|
52
- thumbnail.save('images/thumbnail.png', :png)
53
- end
54
- end
55
-
56
- When the inner block finishes the thumbnail image is freed and when the outer
57
- block finished the lena image is freed.
58
-
59
- If you need even more control, you can use FreeImage::Bitmap#free which frees
60
- the underlying image. Be careful though - once the image is freed further usage
61
- of it will result in a segmentation fault.
62
-
63
- == Implementation Status
64
- The FreeImage API is divided into multiple parts. As summarized below, the Ruby ffi
65
- bindings currently implement a subset of the available api. Patches are welcome to
66
- extend the coverage.
67
-
68
- === Bitmap functions
69
- * General - FreeImage::Bitmap
70
- * Bitmap management - FreeImage::Bitmap
71
- * Bitmap information - FreeImage::Information, FreeImage::Color::Palette
72
- * Filetype - FreeImage::File, FreeImage::IO, FreeImage::Memory
73
- * Pixel access - FreeImage::Pixel
74
- * Conversion - FreeImage::Conversions
75
- * Tone mapping - Not Implemented
76
- * ICC profile - FreeImage::ICC
77
- * Plugin - Not Implemented
78
- * Multipage - Not Implemented
79
- * Memory I/O streams - FreeImage::MemoryStream
80
- * Compression - Not Implemented
81
- * Helper functions - FreeImage::Helper
82
-
83
- === Metadata Functions
84
- * Introduction - Not Implemented
85
- * Tag creation and destruction - Not Implemented
86
- * Tag accessors - Not Implemented
87
- * Metadata iterator - Not Implemented
88
- * Metadata accessors - Not Implemented
89
- * Metadata helper functions - Not Implemented
90
-
91
- === Toolkit Functions
92
- * Rotation and flipping - FreeImage::Transforms
93
- * Upsampling / downsampling - FreeImage::Modify
94
- * Color manipulation - Not Implemented
95
- * Channel processing - Not Implemented
96
- * Copy / Paste / Composite routines - FreeImage::Modify
97
- * Background filling - FreeImage::Modify
98
- * Miscellaneous algorithms - FreeImage::Helper
99
-
100
- == Documentation
101
- Documentation is available via rdoc, and is installed automatically with the
102
- gem. Note that much of the documentation is directly copied from
103
- the FreeImage API documentation available
104
- here[http://downloads.sourceforge.net/freeimage/FreeImage3151.pdf].
105
-
106
- free-image's online documentation is generated using Hanna. To generate
107
- documentation from source:
108
-
109
- gem install hanna-nouveau
110
- rake rdoc
111
- - or -
112
- rdoc -o doc/rdoc -f hanna -m "README.rdoc" lib/**/*.rb README.rdoc
113
-
114
-
115
- == Support
116
-
117
- If you have any questions about using free-image, please ?
118
-
119
- == License
120
- See LICENSE for license information.
1
+ = FreeImage Ruby Bindings
2
+
3
+ == Overview
4
+ The free-image gem provides Ruby language bindings for the
5
+ FreeImage[http://freeimage.sourceforge.net/] library. It is free software,
6
+ released under the MIT License.
7
+
8
+ FreeImage is an light-weight, open source image manipulation library that
9
+ supports many popular graphics image {formats}[rdoc-ref:FreeImage.formats]
10
+ such as PNG, JPEG, GIF, BMP, and TIFF.
11
+
12
+ We think FreeImage is a great library for applications that need to read, write,
13
+ create and modify images and thumbnails because:
14
+
15
+ * Its easy to use
16
+ * Its supports almost all popular image formats
17
+ * Its a light-weight alternative to larger libraries such as ImageMagick,
18
+ supporting basic manipulation functions but not advanced functionality
19
+ * Its cross-platform
20
+ * The ruby bindings are implemented using FFI, so work across all Ruby
21
+ implementations and do not have to be compiled
22
+ * Its much more comprehensive than ImageScience
23
+ * Has comprehensive documentation
24
+
25
+ Note that FreeImage is not the right library for you if you need:
26
+ * Advanced image processing operations such as convolution and transforms
27
+ * Bitmap drawing
28
+ * Vector graphics
29
+
30
+ == Installation
31
+ free-image requires FreeImage version 3.10 or higher and Ruby 1.8.7 or higher. The easiest way to install
32
+ free-image is via Ruby Gems. To install:
33
+
34
+ gem install free-image
35
+
36
+ == Getting Started
37
+ Getting started is easy - first work through the examples in the {cookbook}[http://cfis.github.io/free-image-ruby/].
38
+ Once you've done that, the refer to rdocs for extensive documentation.
39
+
40
+ == Memory Management
41
+ Opening and working with images consumes some memory. Generally you won't have to
42
+ worry about this. When an image goes out of scope, it will be garbage collected
43
+ and the underlying image memory will be freed.
44
+
45
+ Having said that, \FreeImage also lets you control when the memory is freed.
46
+ Any method that creates a new image also takes a block. When the block finishes,
47
+ the underlying image memory is freed. This works the same way as the File.open
48
+ method. For example:
49
+
50
+ FreeImage::Bitmap.open('images/lena.png') do |image|
51
+ thumbnail = image.make_thumbail do |thumbail|
52
+ thumbnail.save('images/thumbnail.png', :png)
53
+ end
54
+ end
55
+
56
+ When the inner block finishes the thumbnail image is freed and when the outer
57
+ block finished the lena image is freed.
58
+
59
+ If you need even more control, you can use FreeImage::Bitmap#free which frees
60
+ the underlying image. Be careful though - once the image is freed further usage
61
+ of it will result in a segmentation fault.
62
+
63
+ == Implementation Status
64
+ The FreeImage API is divided into multiple parts. As summarized below, the Ruby ffi
65
+ bindings currently implement a subset of the available api. Patches are welcome to
66
+ extend the coverage.
67
+
68
+ === Bitmap functions
69
+ * General - FreeImage::Bitmap
70
+ * Bitmap management - FreeImage::Bitmap
71
+ * Bitmap information - FreeImage::Information, FreeImage::Color::Palette
72
+ * Filetype - FreeImage::File, FreeImage::IO, FreeImage::Memory
73
+ * Pixel access - FreeImage::Pixel
74
+ * Conversion - FreeImage::Conversions
75
+ * Tone mapping - Not Implemented
76
+ * ICC profile - FreeImage::ICC
77
+ * Plugin - Not Implemented
78
+ * Multipage - Not Implemented
79
+ * Memory I/O streams - FreeImage::MemoryStream
80
+ * Compression - Not Implemented
81
+ * Helper functions - FreeImage::Helper
82
+
83
+ === Metadata Functions
84
+ * Introduction - Not Implemented
85
+ * Tag creation and destruction - Not Implemented
86
+ * Tag accessors - Not Implemented
87
+ * Metadata iterator - Not Implemented
88
+ * Metadata accessors - Not Implemented
89
+ * Metadata helper functions - Not Implemented
90
+
91
+ === Toolkit Functions
92
+ * Rotation and flipping - FreeImage::Transforms
93
+ * Upsampling / downsampling - FreeImage::Modify
94
+ * Color manipulation - Not Implemented
95
+ * Channel processing - Not Implemented
96
+ * Copy / Paste / Composite routines - FreeImage::Modify
97
+ * Background filling - FreeImage::Modify
98
+ * Miscellaneous algorithms - FreeImage::Helper
99
+
100
+ == Documentation
101
+ Documentation is available via rdoc, and is installed automatically with the
102
+ gem. Note that much of the documentation is directly copied from
103
+ the FreeImage API documentation available
104
+ here[http://downloads.sourceforge.net/freeimage/FreeImage3151.pdf].
105
+
106
+ free-image's online documentation is generated using Hanna. To generate
107
+ documentation from source:
108
+
109
+ gem install hanna-nouveau
110
+ rake rdoc
111
+ - or -
112
+ rdoc -o doc/rdoc -f hanna -m "README.rdoc" lib/**/*.rb README.rdoc
113
+
114
+
115
+ == Support
116
+
117
+ If you have any questions about using free-image, please ?
118
+
119
+ == License
120
+ See LICENSE for license information.
data/Rakefile CHANGED
@@ -1,47 +1,51 @@
1
- # encoding: UTF-8
2
- # !/usr/bin/env ruby
3
-
4
- require "rubygems"
5
- require "rake/testtask"
6
- require "rubygems/package_task"
7
- require "rdoc/task"
8
- require "fileutils"
9
-
10
- GEM_NAME = "free-image"
11
-
12
- # Read the spec file
13
- spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
14
-
15
- # Setup generic gem
16
- Gem::PackageTask.new(spec) do |pkg|
17
- pkg.package_dir = 'pkg'
18
- pkg.need_tar = false
19
- end
20
-
21
- # RDoc Task
22
- desc "Generate rdoc documentation"
23
- RDoc::Task.new("rdoc") do |rdoc|
24
- rdoc.rdoc_dir = 'doc'
25
- rdoc.title = "FreeImage"
26
- # Show source inline with line numbers
27
- rdoc.options << "--line-numbers"
28
- # Use Hanna - this only works with RDoc 3.1 or greater
29
- rdoc.generator = 'hanna'
30
- # Make the readme file the start page for the generated html
31
- rdoc.main = 'cookbook.rdoc'
32
- rdoc.rdoc_files = FileList['HISTORY',
33
- 'LICENSE',
34
- '*.rdoc',
35
- 'lib/**/*.rb']
36
- end
37
-
38
- desc "Setup Cookbook"
39
- task :cookbook => :rdoc do
40
- FileUtils.cp_r("test/images", "doc/cookbook")
41
- end
42
-
43
- # Test Task
44
- Rake::TestTask.new do |t|
45
- t.libs << "test"
46
- t.verbose = true
47
- end
1
+ # encoding: UTF-8
2
+ # !/usr/bin/env ruby
3
+
4
+ require "rubygems"
5
+ require "rake/testtask"
6
+ require "rubygems/package_task"
7
+ require "rdoc/task"
8
+ require "fileutils"
9
+
10
+ GEM_NAME = "free-image"
11
+
12
+ # Read the spec file
13
+ spec = Gem::Specification.load("#{GEM_NAME}.gemspec")
14
+
15
+ # Setup generic gem
16
+ Gem::PackageTask.new(spec) do |pkg|
17
+ pkg.package_dir = 'pkg'
18
+ pkg.need_tar = false
19
+ end
20
+
21
+ # RDoc Task
22
+ desc "Generate rdoc documentation"
23
+ RDoc::Task.new("rdoc") do |rdoc|
24
+ rdoc.rdoc_dir = 'doc'
25
+ rdoc.title = "FreeImage"
26
+ # Show source inline with line numbers
27
+ rdoc.options << "--line-numbers"
28
+ # Use Hanna - this only works with RDoc 3.1 or greater
29
+ rdoc.generator = 'hanna'
30
+ # Make the readme file the start page for the generated html
31
+ rdoc.main = 'cookbook.rdoc'
32
+ rdoc.rdoc_files = FileList['HISTORY',
33
+ 'LICENSE',
34
+ '*.rdoc',
35
+ 'lib/**/*.rb']
36
+ end
37
+
38
+ desc "Setup Cookbook"
39
+ task :cookbook => :rdoc do
40
+ FileUtils.cp_r("test/images", "doc/cookbook")
41
+ end
42
+
43
+ # Test Task
44
+ Rake::TestTask.new do |t|
45
+ t.pattern = 'test/**/test_*.rb'
46
+ t.libs << "lib"
47
+ t.libs << "test"
48
+ t.verbose = true
49
+ end
50
+
51
+ task default: :test
@@ -1,238 +1,249 @@
1
- = \Getting Started With \FreeImage
2
- Below are various recipes to get you up and running with \FreeImage as quickly
3
- as possible. The example images tcan be found in the
4
- test/images directory. For more general information about \FreeImage, including
5
- installation instructions, please refer to README.rdoc.
6
-
7
- == Loading An Image
8
- The first step in using \FreeImage is to load an image. \FreeImage can load
9
- images from files[rdoc-ref::FreeImage::File], strings[rdoc-ref::FreeImage::Memory]
10
- or IO[rdoc-ref::FreeImage::IO] streams. The simplest way to do this is
11
- via the FreeImage::Bitmap.open method:
12
-
13
- image = FreeImage::Bitmap.open('images/lena.tiff')
14
- image = FreeImage::Bitmap.open(io_object)
15
- image = FreeImage::Bitmap.open(FreeImage::Memory.new(string))
16
-
17
- The open method also takes two additional optional parameters, format and flags,
18
- that provide greater control over opening images if needed.
19
-
20
- The open method works similary to File.open, meaning you can also pass it a block.
21
-
22
- FreeImage::Bitmap.open('images/lena.png') do |image|
23
- ... do some stuff..
24
- end
25
-
26
- Once the block completes, the image will be automatically freed for you. If you don't
27
- pass block, then the image will be freed by Ruby's Garbage Collector once it goes out
28
- of scope. For more information about memory management, refer to
29
- the readme [rdoc-ref:README.rdoc].
30
-
31
- Image[link:cookbook/lena.png]
32
-
33
- == Saving An Image
34
- Now let's say you want to save the image to :png format. This is done
35
- via the FreeImage::Bitmap.save method. The save method takes a destination,
36
- which can be a file[rdoc-ref::FreeImage::File], string[rdoc-ref::FreeImage::Memory]
37
- or IO[rdoc-ref::FreeImage::IO] stream, and an image format.
38
-
39
- image.save('images/lena.png', :png)
40
-
41
- == Creating a Thumbnail
42
- Next, let's assume our application needs to show a list of thumbnails for the images
43
- it stores. This can be done using the make_thumbnail[rdoc-ref:FreeImage::Modify.make_thumbnail]
44
- method in the Modify[rdoc-ref:FreeImage::Modify] module.
45
-
46
- thumbnail = image.make_thumbnail(100)
47
- thumbnail.save('images/lena_thumbnail.png', :png)
48
-
49
- Thumbnail[link:cookbook/lena_thumbnail.png]
50
-
51
- == Putting a Border Around a Thumbnail
52
- Once we have created a thumbnail, let's outline it with a red border. There
53
- are various approaches to do doing this. In the first approach, we'll use
54
- the enlarge_canvas[FreeImage::Modify.enlarge_canvas] method.
55
-
56
- # Border size
57
- border = 4
58
-
59
- # Specify the color as red
60
- color = FreeImage::RGBQuad.create(255, 0, 0)
61
-
62
- # Add 4 pixel red border around the thumbnail
63
- thumbnail_border = thumbnail.enlarge_canvas(border, border, border, border, color)
64
- thumbnail_border.save('images/lena_thumbnail_border_1.png', :png)
65
-
66
- ThumbnailBorderEnlarge[link:cookbook/lena_thumbnail_border_enlarge.png]
67
-
68
- In the second approach, let's create a image with a red background
69
- and then paste it on top of our thumbnail:
70
-
71
- # Create a red image that is the same size as the thumbnail
72
- red_image = FreeImage::Bitmap.create(thumbnail.width, thumbnail.height, thumbnail.bits_per_pixel)
73
- red_image_new.fill_background(color)
74
-
75
- # Now copy a subimage from the thumbnail that is 2 borders less wide and tall
76
- subimage = thumbnail.copy(border, border, thumbnail.width - border, thumbnail.height - border)
77
-
78
- # Now paste the subimage into the red image. Specify an alpha over 255
79
- # to disable alpha blending
80
- red_image.paste(subimage, border, border, 300)
81
- red_image.save('images/test1.png', :png)
82
- thumbnail_border.save('images/lena_thumbnail_border_2.png', :png)
83
-
84
- ThumbnailBorderPaste[link:cookbook/lena_thumbnail_border_paste.png]
85
-
86
- == Resampling An Image
87
- If you need additional control over how an image is resampled, use the
88
- FreeImage::Bitmap#rescale method, which lets you specify a filtering
89
- algorithm. To see how each filter works, let's scale up the thumbnail
90
- by 400%.
91
-
92
- thumbnail = FreeImage::Bitmap.open('images/lena_thumbnail.png')
93
-
94
- FreeImage.enum_type(:filter).symbols.each do |filter|
95
- rescaled = thumbnail.rescale(thumbnail.width * 4, thumbnail.height * 4, filter)
96
- rescaled.save("images/lena_rescale_#{filter.to_s}.png", :png)
97
- end
98
-
99
- RescaleBox[link:cookbook/lena_rescale_box.png]
100
- RescaleBicubic[link:cookbook/lena_rescale_bicubic.png]
101
- RescaleBilinear[link:cookbook/lena_rescale_bilinear.png]
102
- RescaleBspline[link:cookbook/lena_rescale_bspline.png]
103
- RescaleCatmullrom[link:cookbook/lena_rescale_catmullrom.png]
104
- RescaleLanczos3[link:cookbook/lena_rescale_lanczos3.png]
105
-
106
- == Flipping An Image
107
- The Transform modules lets you flip or rotate an image. Let's say you want to
108
- flip your image horizontally:
109
-
110
- image.flip_horizontal
111
- image.save('images/lena_flipped.png', :png)
112
-
113
- Thumbnail[link:cookbook/lena_flipped.png]
114
-
115
- == Rotating An Image
116
- Next, let's rotate an image. Two methods are provide, FreeImage::Bitmap#rotate and
117
- FreeImage::Bitmap#rotate_ex. The #rotate method is simpler to use:
118
-
119
- image = FreeImage::Bitmap.open('images/lena.png', :png)
120
-
121
- # Rotate the image 45 degrees using white as the background fill color
122
- color = FreeImage::RGBQuad.create(255, 255, 255, 0)
123
- rotated = image.rotate(45, color)
124
- rotated.save("images/lena_rotate_45.png", :png)
125
-
126
- Thumbnail[link:cookbook/lena_rotate_45.png]
127
-
128
- Notice that the image size and geometry has changed? Thus, the #rotate
129
- function is best for rotating and image 90, 180 or 270 degrees.
130
-
131
- Let's now rotate the image using the #rotate_ex method while using a mask:
132
-
133
- rotated = image.rotate_ex(45, 0, 0, image.width/2, image.height/2, true)
134
- rotated.save("images/lena_rotate_ex_45_masked.png", :png)
135
-
136
- And now let's rotate the image without a mask, so data is filled in using
137
- a mirroring algorithm:
138
-
139
- rotated = image.rotate_ex(45, 0, 0, image.width/2, image.height/2, false)
140
- rotated.save("images/lena_rotate_ex_45_mirrored.png", :png)
141
-
142
- Thumbnail[link:cookbook/lena_rotate_ex_45_masked.png]
143
- Thumbnail[link:cookbook/lena_rotate_ex_45_mirrored.png]
144
-
145
- Last, lets rotate the image around the top left corner:
146
-
147
- rotated = image.rotate_ex(45, 0, 0, 0, 0, true)
148
- rotated.save("images/lena_rotate_ex_45_top_left.png", :png)
149
-
150
- Thumbnail[link:cookbook/lena_rotate_ex_45_top_left.png]
151
-
152
- == Compositing An Image
153
- \FreeImage also lets you composite an image with a background color or another image.
154
- Here is an example of compositing an image with the color green.
155
-
156
- image = FreeImage::Bitmap.open('images/sample.png')
157
- color = FreeImage::RGBQuad.create(0, 255, 0, 0)
158
- composite = image.composite_with_color(color)
159
- composite.save("images/sample_composite_color.png", :png)
160
-
161
- Sample[link:cookbook/sample.png]
162
- SampleCompositeColor[link:cookbook/sample_composite_color.png]
163
-
164
- == Manipulating An Image
165
- \FreeImage also allows you to directly access each pixel in an image.
166
- As an example, let's create an image that has a gradient from
167
- blue in the top left corner to green in the bottom right
168
-
169
- image = FreeImage::Bitmap.create(300, 300, 24)
170
- color = FreeImage::RGBQuad.new
171
-
172
- image.width.times do |x|
173
- image.height.times do |y|
174
- color[:green] = (x.to_f/image.width) * 255
175
- color[:blue] = (y.to_f/image.height) * 255
176
- image.set_pixel_color(x, y, color)
177
- end
178
- end
179
-
180
- image.save('images/gradient.png', :png)
181
-
182
- Gradient[link:cookbook/gradient.png]
183
-
184
- You can use a similar technique as another solution to drawing a border around a
185
- thumbnail as discussed above.
186
-
187
- == Using Scanlines
188
- Scanlines[rdoc-ref:FreeImage::Scanline] provide low level access to image data.
189
- The only lower-level access is working with the actual raw bytes, which you can do
190
- via the FreeeImage::Bitmap#bytes method, but its not recommended.
191
-
192
- A scanline represents one row of image data, starting from the bottom. Let's go back
193
- to our example above of drawing a red border around a thumbnail.
194
-
195
- # Helper method
196
- def set_to_red(color)
197
- color[:red] = 255
198
- color[:green] = 0
199
- color[:blue] = 0
200
- end
201
-
202
- # Create a thumbnail
203
- image = FreeImage::Bitmap.open('images/lena.png')
204
- thumbnail = image.make_thumbnail(100)
205
-
206
- # Draw bottom border 4 pixels tall
207
- (0..3).each do |index|
208
- scanline = thumbnail.scanline(index)
209
- scanline.each do |color|
210
- set_to_red(color)
211
- end
212
- end
213
-
214
- # Draw top border 4 pixels tall
215
- ((thumbnail.height - 5)..(thumbnail.height - 1)).each do |index|
216
- scanline = thumbnail.scanline(index)
217
- scanline.each do |color|
218
- set_to_red(color)
219
- end
220
- end
221
-
222
- # We could skip top and bottom 4 scanlines since
223
- # already drew them.
224
- thumbnail.height.each do |index|
225
- scanline = thumbnail.scanline(index)
226
- # Draw left and right borders 4 pixels wide
227
- (0..4).each do |index|
228
- set_to_red(scanline[index])
229
- end
230
-
231
- ((thumbnail.width - 5)..(thumbnail.width - 1)).each do |index|
232
- set_to_red(scanline[index])
233
- end
234
- end
235
-
236
- thumbnail.save("images/lena_thumbnail_border_scanline.png", :png)
237
-
1
+ = \Getting Started With \FreeImage
2
+ Below are various recipes to get you up and running with \FreeImage as quickly
3
+ as possible. The example images tcan be found in the
4
+ test/images directory. For more general information about \FreeImage, including
5
+ installation instructions, please refer to README.rdoc.
6
+
7
+ == Loading An Image
8
+ The first step in using \FreeImage is to load an image. \FreeImage can load
9
+ images from files[rdoc-ref::FreeImage::File], strings[rdoc-ref::FreeImage::Memory]
10
+ or IO[rdoc-ref::FreeImage::IO] streams. The simplest way to do this is
11
+ via the FreeImage::Bitmap.open method:
12
+
13
+ image = FreeImage::Bitmap.open('images/lena.tiff')
14
+ image = FreeImage::Bitmap.open(io_object)
15
+ image = FreeImage::Bitmap.open(FreeImage::Memory.new(string))
16
+
17
+ The open method also takes two additional optional parameters, format and flags,
18
+ that provide greater control over opening images if needed.
19
+
20
+ The open method works similary to File.open, meaning you can also pass it a block.
21
+
22
+ FreeImage::Bitmap.open('images/lena.png') do |image|
23
+ ... do some stuff..
24
+ end
25
+
26
+ Once the block completes, the image will be automatically freed for you. If you don't
27
+ pass block, then the image will be freed by Ruby's Garbage Collector once it goes out
28
+ of scope. For more information about memory management, refer to
29
+ the readme [rdoc-ref:README.rdoc].
30
+
31
+ Image[link:cookbook/lena.png]
32
+
33
+ == Saving An Image
34
+ Now let's say you want to save the image to :png format. This is done
35
+ via the FreeImage::Bitmap.save method. The save method takes a destination,
36
+ which can be a file[rdoc-ref::FreeImage::File], string[rdoc-ref::FreeImage::Memory]
37
+ or IO[rdoc-ref::FreeImage::IO] stream, and an image format.
38
+
39
+ image.save('images/lena.png', :png)
40
+
41
+ == Creating a Thumbnail
42
+ Next, let's assume our application needs to show a list of thumbnails for the images
43
+ it stores. This can be done using the make_thumbnail[rdoc-ref:FreeImage::Modify.make_thumbnail]
44
+ method in the Modify[rdoc-ref:FreeImage::Modify] module.
45
+
46
+ thumbnail = image.make_thumbnail(100)
47
+ thumbnail.save('images/lena_thumbnail.png', :png)
48
+
49
+ Thumbnail[link:cookbook/lena_thumbnail.png]
50
+
51
+ == Putting a Border Around a Thumbnail
52
+ Once we have created a thumbnail, let's outline it with a red border. There
53
+ are various approaches to do doing this. In the first approach, we'll use
54
+ the enlarge_canvas[FreeImage::Modify.enlarge_canvas] method.
55
+
56
+ # Border size
57
+ border = 4
58
+
59
+ # Specify the color as red
60
+ color = FreeImage::RGBQuad.create(255, 0, 0)
61
+
62
+ # Add 4 pixel red border around the thumbnail
63
+ thumbnail_border = thumbnail.enlarge_canvas(border, border, border, border, color)
64
+ thumbnail_border.save('images/lena_thumbnail_border_1.png', :png)
65
+
66
+ ThumbnailBorderEnlarge[link:cookbook/lena_thumbnail_border_enlarge.png]
67
+
68
+ In the second approach, let's create a image with a red background
69
+ and then paste it on top of our thumbnail:
70
+
71
+ # Create a red image that is the same size as the thumbnail
72
+ red_image = FreeImage::Bitmap.create(thumbnail.width, thumbnail.height, thumbnail.bits_per_pixel)
73
+ red_image_new.fill_background(color)
74
+
75
+ # Now copy a subimage from the thumbnail that is 2 borders less wide and tall
76
+ subimage = thumbnail.copy(border, border, thumbnail.width - border, thumbnail.height - border)
77
+
78
+ # Now paste the subimage into the red image. Specify an alpha over 255
79
+ # to disable alpha blending
80
+ red_image.paste(subimage, border, border, 300)
81
+ red_image.save('images/test1.png', :png)
82
+ thumbnail_border.save('images/lena_thumbnail_border_2.png', :png)
83
+
84
+ ThumbnailBorderPaste[link:cookbook/lena_thumbnail_border_paste.png]
85
+
86
+ == Resampling An Image
87
+ If you need additional control over how an image is resampled, use the
88
+ FreeImage::Bitmap#rescale method, which lets you specify a filtering
89
+ algorithm. To see how each filter works, let's scale up the thumbnail
90
+ by 400%.
91
+
92
+ thumbnail = FreeImage::Bitmap.open('images/lena_thumbnail.png')
93
+
94
+ FreeImage.enum_type(:filter).symbols.each do |filter|
95
+ rescaled = thumbnail.rescale(thumbnail.width * 4, thumbnail.height * 4, filter)
96
+ rescaled.save("images/lena_rescale_#{filter.to_s}.png", :png)
97
+ end
98
+
99
+ RescaleBox[link:cookbook/lena_rescale_box.png]
100
+ RescaleBicubic[link:cookbook/lena_rescale_bicubic.png]
101
+ RescaleBilinear[link:cookbook/lena_rescale_bilinear.png]
102
+ RescaleBspline[link:cookbook/lena_rescale_bspline.png]
103
+ RescaleCatmullrom[link:cookbook/lena_rescale_catmullrom.png]
104
+ RescaleLanczos3[link:cookbook/lena_rescale_lanczos3.png]
105
+
106
+ == Flipping An Image
107
+ The Transform modules lets you flip or rotate an image. Let's say you want to
108
+ flip your image horizontally:
109
+
110
+ image.flip_horizontal
111
+ image.save('images/lena_flipped.png', :png)
112
+
113
+ Thumbnail[link:cookbook/lena_flipped.png]
114
+
115
+ == Rotating An Image
116
+ Next, let's rotate an image. Two methods are provide, FreeImage::Bitmap#rotate and
117
+ FreeImage::Bitmap#rotate_ex. The #rotate method is simpler to use:
118
+
119
+ image = FreeImage::Bitmap.open('images/lena.png', :png)
120
+
121
+ # Rotate the image 45 degrees using white as the background fill color
122
+ color = FreeImage::RGBQuad.create(255, 255, 255, 0)
123
+ rotated = image.rotate(45, color)
124
+ rotated.save("images/lena_rotate_45.png", :png)
125
+
126
+ Thumbnail[link:cookbook/lena_rotate_45.png]
127
+
128
+ Notice that the image size and geometry has changed? Thus, the #rotate
129
+ function is best for rotating and image 90, 180 or 270 degrees.
130
+
131
+ Let's now rotate the image using the #rotate_ex method while using a mask:
132
+
133
+ rotated = image.rotate_ex(45, 0, 0, image.width/2, image.height/2, true)
134
+ rotated.save("images/lena_rotate_ex_45_masked.png", :png)
135
+
136
+ And now let's rotate the image without a mask, so data is filled in using
137
+ a mirroring algorithm:
138
+
139
+ rotated = image.rotate_ex(45, 0, 0, image.width/2, image.height/2, false)
140
+ rotated.save("images/lena_rotate_ex_45_mirrored.png", :png)
141
+
142
+ Thumbnail[link:cookbook/lena_rotate_ex_45_masked.png]
143
+ Thumbnail[link:cookbook/lena_rotate_ex_45_mirrored.png]
144
+
145
+ Last, lets rotate the image around the top left corner:
146
+
147
+ rotated = image.rotate_ex(45, 0, 0, 0, 0, true)
148
+ rotated.save("images/lena_rotate_ex_45_top_left.png", :png)
149
+
150
+ Thumbnail[link:cookbook/lena_rotate_ex_45_top_left.png]
151
+
152
+ == Compositing An Image
153
+ \FreeImage also lets you composite an image with a background color or another image.
154
+ Here is an example of compositing an image with the color green.
155
+
156
+ image = FreeImage::Bitmap.open('images/sample.png')
157
+ color = FreeImage::RGBQuad.create(0, 255, 0, 0)
158
+ composite = image.composite_with_color(color)
159
+ composite.save("images/sample_composite_color.png", :png)
160
+
161
+ Sample[link:cookbook/sample.png]
162
+ SampleCompositeColor[link:cookbook/sample_composite_color.png]
163
+
164
+ And here is an example of compositing two images together:
165
+
166
+ image = FreeImage::Bitmap.open(image_path('sample.png'))
167
+ background = FreeImage::Bitmap.open(image_path('gradient.png'))
168
+ # Need to make sure the background image is the same size
169
+ background = background.rescale(image.width, image.height, :box)
170
+ composite = image.composite(background)
171
+
172
+ Sample[link:cookbook/sample.png]
173
+ SampleCompositeColor[link:cookbook/sample_composite.png]
174
+
175
+ == Manipulating An Image
176
+ \FreeImage also allows you to directly access each pixel in an image.
177
+ As an example, let's create an image that has a gradient from
178
+ blue in the top left corner to green in the bottom right
179
+
180
+ image = FreeImage::Bitmap.create(300, 300, 24)
181
+ color = FreeImage::RGBQuad.new
182
+
183
+ image.width.times do |x|
184
+ image.height.times do |y|
185
+ color[:green] = (x.to_f/image.width) * 255
186
+ color[:blue] = (y.to_f/image.height) * 255
187
+ image.set_pixel_color(x, y, color)
188
+ end
189
+ end
190
+
191
+ image.save('images/gradient.png', :png)
192
+
193
+ Gradient[link:cookbook/gradient.png]
194
+
195
+ You can use a similar technique as another solution to drawing a border around a
196
+ thumbnail as discussed above.
197
+
198
+ == Using Scanlines
199
+ Scanlines[rdoc-ref:FreeImage::Scanline] provide low level access to image data.
200
+ The only lower-level access is working with the actual raw bytes, which you can do
201
+ via the FreeeImage::Bitmap#bytes method, but its not recommended.
202
+
203
+ A scanline represents one row of image data, starting from the bottom. Let's go back
204
+ to our example above of drawing a red border around a thumbnail.
205
+
206
+ # Helper method
207
+ def set_to_red(color)
208
+ color[:red] = 255
209
+ color[:green] = 0
210
+ color[:blue] = 0
211
+ end
212
+
213
+ # Create a thumbnail
214
+ image = FreeImage::Bitmap.open('images/lena.png')
215
+ thumbnail = image.make_thumbnail(100)
216
+
217
+ # Draw bottom border 4 pixels tall
218
+ (0..3).each do |index|
219
+ scanline = thumbnail.scanline(index)
220
+ scanline.each do |color|
221
+ set_to_red(color)
222
+ end
223
+ end
224
+
225
+ # Draw top border 4 pixels tall
226
+ ((thumbnail.height - 5)..(thumbnail.height - 1)).each do |index|
227
+ scanline = thumbnail.scanline(index)
228
+ scanline.each do |color|
229
+ set_to_red(color)
230
+ end
231
+ end
232
+
233
+ # We could skip top and bottom 4 scanlines since
234
+ # already drew them.
235
+ thumbnail.height.each do |index|
236
+ scanline = thumbnail.scanline(index)
237
+ # Draw left and right borders 4 pixels wide
238
+ (0..4).each do |index|
239
+ set_to_red(scanline[index])
240
+ end
241
+
242
+ ((thumbnail.width - 5)..(thumbnail.width - 1)).each do |index|
243
+ set_to_red(scanline[index])
244
+ end
245
+ end
246
+
247
+ thumbnail.save("images/lena_thumbnail_border_scanline.png", :png)
248
+
238
249
  ThumbnailBorderScanline[link:cookbook/lena_thumbnail_border_scanline.png]