free-image 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,30 +1,31 @@
1
- # encoding: utf-8
2
-
3
- Gem::Specification.new do |spec|
4
- spec.name = 'free-image'
5
- spec.version = '0.6.2'
6
- spec.summary = 'Ruby Bindings for the Free Image Library'
7
- spec.description = <<-EOS
8
- FreeImage is an Open Source library project for developers who would like to support
9
- popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by
10
- today's multimedia applications. FreeImage is easy to use, fast, multithreading
11
- safe, compatible with all 32-bit or 64-bit versions of Windows, and
12
- cross-platform (works both with Linux and Mac OS X).
13
- EOS
14
- spec.authors = [ 'Charlie Savage']
15
- spec.platform = Gem::Platform::RUBY
16
- spec.files = Dir.glob(['HISTORY',
17
- 'LICENSE',
18
- 'free-image.gemspec',
19
- 'Rakefile',
20
- '*.rdoc',
21
- 'lib/**/*.rb',
22
- 'test/**/*'])
23
- spec.test_files = Dir.glob("test/test_*.rb")
24
- spec.required_ruby_version = '>= 1.8.7'
25
- spec.date = Time.now
26
-
27
- spec.add_dependency('ffi', '>=1.0.10')
28
- spec.add_development_dependency('hanna-nouveau')
29
- spec.add_development_dependency('open4')
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'free-image'
5
+ spec.version = '0.7.0'
6
+ spec.summary = 'Ruby Bindings for the Free Image Library'
7
+ spec.description = <<-EOS
8
+ FreeImage is an Open Source library project for developers who would like to support
9
+ popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by
10
+ today's multimedia applications. FreeImage is easy to use, fast, multithreading
11
+ safe, compatible with all 32-bit or 64-bit versions of Windows, and
12
+ cross-platform (works both with Linux and Mac OS X).
13
+ EOS
14
+ spec.authors = [ 'Charlie Savage']
15
+ spec.platform = Gem::Platform::RUBY
16
+ spec.files = Dir.glob(['HISTORY',
17
+ 'LICENSE',
18
+ 'free-image.gemspec',
19
+ 'Rakefile',
20
+ '*.rdoc',
21
+ 'lib/**/*.rb',
22
+ 'test/**/*'])
23
+ spec.test_files = Dir.glob("test/test_*.rb")
24
+ spec.required_ruby_version = '>= 1.8.7'
25
+ spec.date = Time.now
26
+
27
+ spec.add_dependency('ffi', '>=1.0.10')
28
+ spec.add_development_dependency('rake')
29
+ spec.add_development_dependency('hanna-nouveau')
30
+ spec.add_development_dependency('open4')
30
31
  end
@@ -49,8 +49,6 @@ module FreeImage
49
49
 
50
50
  if free_image_library_paths.any?
51
51
  ffi_lib(*free_image_library_paths)
52
- elsif FFI::Platform.windows?
53
- ffi_lib("FreeImaged")
54
52
  else
55
53
  ffi_lib("freeimage")
56
54
  end
@@ -71,6 +69,7 @@ require 'free-image/types/rgba16'
71
69
  require 'free-image/types/rgbf'
72
70
  require 'free-image/types/rgbaf'
73
71
  require 'free-image/types/complex'
72
+ require 'free-image/types/info_header'
74
73
 
75
74
  # Enums
76
75
  require 'free-image/enums/color_types'
@@ -153,8 +153,8 @@ module FreeImage
153
153
  # dst:: The destination where the image will be saved.
154
154
  # format:: The format[rdoc-ref:FreeImage.formats] to save the image to.
155
155
  # flags:: Format specific flags that control how a bitmap is saved. These flags are defined
156
- # as constants on the AbstractSource class. Flags can be combined using
157
- # Ruby's bitwise or operator (|)
156
+ # as constants on the AbstractSource[rdoc-ref:FreeImage::AbstractSource::Encoder] class.
157
+ # Flags can be combined using Ruby's bitwise or operator (|)
158
158
  #
159
159
  def save(source, format, flags = 0)
160
160
  self.class.figure_source(source).save(self, format, flags)
@@ -1,12 +1,12 @@
1
- module FreeImage
2
- ##
3
- #FreeImage supports the following rescaling filters:
4
- #
5
- # :method: filters
6
- enum :filter, [:box, 0,
7
- :bicubic, 1,
8
- :bilinear, 2,
9
- :bspline, 3,
10
- :catmullrom, 4,
11
- :lanczos3, 5]
1
+ module FreeImage
2
+ ##
3
+ #FreeImage supports the following rescaling filters:
4
+ #
5
+ # :method: filters
6
+ enum :filter, [:box, 0,
7
+ :bicubic, 1,
8
+ :bilinear, 2,
9
+ :bspline, 3,
10
+ :catmullrom, 4,
11
+ :lanczos3, 5]
12
12
  end
@@ -1,44 +1,44 @@
1
- module FreeImage
2
- LAST_ERROR = 'free_image_error'
3
-
4
- #typedef void (*FreeImage_OutputMessageFunction)(FREE_IMAGE_FORMAT fif, const char *msg);
5
- #typedef void (DLL_CALLCONV *FreeImage_OutputMessageFunctionStdCall)(FREE_IMAGE_FORMAT fif, const char *msg);
6
- callback(:output_message_callback, [:format, :pointer], :void)
7
-
8
- if FFI::Platform.windows?
9
- #DLL_API void DLL_CALLCONV FreeImage_SetOutputMessageStdCall(FreeImage_OutputMessageFunctionStdCall omf);
10
- attach_function('FreeImage_SetOutputMessage', 'FreeImage_SetOutputMessageStdCall', [:output_message_callback], :void)
11
- else
12
- #DLL_API void DLL_CALLCONV FreeImage_SetOutputMessage(FreeImage_OutputMessageFunction omf);
13
- attach_function('FreeImage_SetOutputMessage', [:output_message_callback], :void)
14
- end
15
-
16
- class Error < StandardError
17
- attr_reader :format
18
-
19
- def initialize(format, message)
20
- @format = format
21
- super(message)
22
- end
23
-
24
- # def to_s
25
- # "#{self.message} Format: #{self.format}"
26
- # end
27
- end
28
-
29
- CALLBACK = Proc.new do |format, ptr|
30
- # Create an exception object and stash it away. We can't raise it here
31
- # because FreeImage won't be able to clean up any resources it needs to.
32
- # Instead, the calling code must call check_last_error.
33
- message = ptr.get_string(0)
34
- Thread.current[LAST_ERROR] = Error.new(format, message)
35
- end
36
- FreeImage_SetOutputMessage(CALLBACK)
37
-
38
- def check_last_error
39
- error = Thread.current[LAST_ERROR]
40
- Thread.current[LAST_ERROR] = nil
41
- raise(error) if error
42
- end
43
- module_function :check_last_error
1
+ module FreeImage
2
+ LAST_ERROR = 'free_image_error'
3
+
4
+ #typedef void (*FreeImage_OutputMessageFunction)(FREE_IMAGE_FORMAT fif, const char *msg);
5
+ #typedef void (DLL_CALLCONV *FreeImage_OutputMessageFunctionStdCall)(FREE_IMAGE_FORMAT fif, const char *msg);
6
+ callback(:output_message_callback, [:format, :pointer], :void)
7
+
8
+ if FFI::Platform.windows?
9
+ #DLL_API void DLL_CALLCONV FreeImage_SetOutputMessageStdCall(FreeImage_OutputMessageFunctionStdCall omf);
10
+ attach_function('FreeImage_SetOutputMessage', 'FreeImage_SetOutputMessageStdCall', [:output_message_callback], :void)
11
+ else
12
+ #DLL_API void DLL_CALLCONV FreeImage_SetOutputMessage(FreeImage_OutputMessageFunction omf);
13
+ attach_function('FreeImage_SetOutputMessage', [:output_message_callback], :void)
14
+ end
15
+
16
+ class Error < StandardError
17
+ attr_reader :format
18
+
19
+ def initialize(format, message)
20
+ @format = format
21
+ super(message)
22
+ end
23
+
24
+ # def to_s
25
+ # "#{self.message} Format: #{self.format}"
26
+ # end
27
+ end
28
+
29
+ CALLBACK = Proc.new do |format, ptr|
30
+ # Create an exception object and stash it away. We can't raise it here
31
+ # because FreeImage won't be able to clean up any resources it needs to.
32
+ # Instead, the calling code must call check_last_error.
33
+ message = ptr.get_string(0)
34
+ Thread.current[LAST_ERROR] = Error.new(format, message)
35
+ end
36
+ FreeImage_SetOutputMessage(CALLBACK)
37
+
38
+ def check_last_error
39
+ error = Thread.current[LAST_ERROR]
40
+ Thread.current[LAST_ERROR] = nil
41
+ raise(error) if error
42
+ end
43
+ module_function :check_last_error
44
44
  end
@@ -1,254 +1,254 @@
1
- module FreeImage
2
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo4Bits(FIBITMAP *dib);
3
- attach_function('FreeImage_ConvertTo4Bits', [:pointer], :pointer)
4
-
5
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo8Bits(FIBITMAP *dib);
6
- attach_function('FreeImage_ConvertTo8Bits', [:pointer], :pointer)
7
-
8
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToGreyscale(FIBITMAP *dib);
9
- attach_function('FreeImage_ConvertToGreyscale', [:pointer], :pointer)
10
-
11
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo16Bits555(FIBITMAP *dib);
12
- attach_function('FreeImage_ConvertTo16Bits555', [:pointer], :pointer)
13
-
14
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo16Bits565(FIBITMAP *dib);
15
- attach_function('FreeImage_ConvertTo16Bits565', [:pointer], :pointer)
16
-
17
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo24Bits(FIBITMAP *dib);
18
- attach_function('FreeImage_ConvertTo24Bits', [:pointer], :pointer)
19
-
20
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo32Bits(FIBITMAP *dib);
21
- attach_function('FreeImage_ConvertTo32Bits', [:pointer], :pointer)
22
-
23
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_Dither(FIBITMAP *dib, FREE_IMAGE_DITHER algorithm);
24
- attach_function('FreeImage_Dither', [:pointer, :dither], :pointer)
25
-
26
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_Threshold(FIBITMAP *dib, BYTE T);
27
- attach_function('FreeImage_Threshold', [:pointer, :byte], :pointer)
28
-
29
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToStandardType(FIBITMAP *src, BOOL scale_linear FI_DEFAULT(TRUE));
30
- attach_function('FreeImage_ConvertToStandardType', [:pointer, FreeImage::Boolean], :pointer)
31
-
32
- #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToType(FIBITMAP *src, FREE_IMAGE_TYPE dst_type, BOOL scale_linear FI_DEFAULT(TRUE));
33
- attach_function('FreeImage_ConvertToType', [:pointer, :image_type, FreeImage::Boolean], :pointer)
34
-
35
- module Conversions
36
- # :call-seq:
37
- # image.convert_to_4bits -> bitmap
38
- # image.convert_to_4bits {|img| block} -> bitmap
39
- #
40
- # Converts a bitmap to 4 bits. If the bitmap is a high-color (16, 24 or 32-bit),
41
- # monochrome or greyscale bitmap (1 or 8-bit) the end result will be a greyscale bitmap.
42
- # A 1-bit bitmap will become a palletized bitmap.
43
- #
44
- # Note that "greyscale" means that the resulting bitmap will have grey colors,
45
- # but the palette won't be a linear greyscale palette. Thus, FreeImage::Bitmap.color_type
46
- # will return a :palette.
47
- #
48
- # If an optional block is provided, it will be passed the new image as an argument. The
49
- # image will be automatically closed when the block completes.
50
- #
51
- def convert_to_4bits(&block)
52
- ptr = FreeImage.FreeImage_ConvertTo4Bits(self)
53
- FreeImage.check_last_error
54
- self.class.new(ptr, &block)
55
- end
56
-
57
- # :call-seq:
58
- # image.convert_to_8bits -> bitmap
59
- # image.convert_to_8bits {|img| block} -> bitmap
60
- #
61
- # Converts a bitmap to 8 bits. If the bitmap is a high-color (16, 24 or 32-bit),
62
- # monochrome or greyscale bitmap (1 or 4-bit) the end result will be a greyscale bitmap.
63
- # A 1-bit or 4-bit bitmap will become a palletized bitmap.
64
- #
65
- # For 16-bit greyscale images (images whose type is :uint16), conversion is done by
66
- # dividing the 16-bit channel by 256 (see also FreeImage::Bitmap.ConvertToStandardType).
67
- # A nil value is returned for other non-standard bitmap types.
68
- #
69
- # If an optional block is provided, it will be passed the new image as an argument. The
70
- # image will be automatically closed when the block completes.
71
- #
72
- def convert_to_8bits(&block)
73
- ptr = FreeImage.FreeImage_ConvertTo8Bits(self)
74
- FreeImage.check_last_error
75
- self.class.new(ptr, &block)
76
- end
77
-
78
- # :call-seq:
79
- # image.convert_to_greyscale -> bitmap
80
- # image.convert_to_greyscale {|img| block} -> bitmap
81
- #
82
- # Converts a bitmap to a 8-bit greyscale image with a linear ramp. Contrary to
83
- # the FreeImage::Conversions#convert_to_8bits function, 1-, 4- and 8-bit palletized
84
- # bitmaps are correctly converted, as well as images with a :minis_white color type.
85
- #
86
- # If an optional block is provided, it will be passed the new image as an argument. The
87
- # image will be automatically closed when the block completes.
88
- #
89
- def convert_to_greyscale(&block)
90
- ptr = FreeImage.FreeImage_ConvertToGreyscale(self)
91
- FreeImage.check_last_error
92
- self.class.new(ptr, &block)
93
- end
94
-
95
- # :call-seq:
96
- # image.convert_to_16bits_555 -> bitmap
97
- # image.convert_to_16bits_555 {|img| block} -> bitmap
98
- #
99
- # Converts a bitmap to 16 bits, where each pixel has a color pattern of
100
- # 5 bits red, 5 bits green and 5 bits blue. One bit in each pixel is
101
- # unused.
102
- #
103
- # If an optional block is provided, it will be passed the new image as an argument. The
104
- # image will be automatically closed when the block completes.
105
- #
106
- def convert_to_16bits_555(&block)
107
- ptr = FreeImage.FreeImage_ConvertTo16Bits555(self)
108
- FreeImage.check_last_error
109
- self.class.new(ptr, &block)
110
- end
111
-
112
- # :call-seq:
113
- # image.convert_to_16bits_565 -> bitmap
114
- # image.convert_to_16bits_565 {|img| block} -> bitmap
115
- #
116
- # Converts a bitmap to 16 bits, where each pixel has a color pattern of
117
- # 5 bits red, 6 bits green and 5 bits blue. One bit in each pixel is
118
- # unused.
119
- #
120
- # If an optional block is provided, it will be passed the new image as an argument. The
121
- # image will be automatically closed when the block completes.
122
- #
123
- def convert_to_16bits_565(&block)
124
- ptr = FreeImage.FreeImage_ConvertTo16Bits565(self)
125
- FreeImage.check_last_error
126
- self.class.new(ptr, &block)
127
- end
128
-
129
- # :call-seq:
130
- # image.convert_to_24bits -> bitmap
131
- # image.convert_to_24bits {|img| block} -> bitmap
132
- #
133
- # Converts a bitmap to 24 bits. For 48-bit RGB images, conversion is done
134
- # by dividing each 16-bit channel by 256. A nil value is returned for
135
- # other non-standard bitmap types.
136
- #
137
- # If an optional block is provided, it will be passed the new image as an argument. The
138
- # image will be automatically closed when the block completes.
139
- #
140
- def convert_to_24bits(&block)
141
- ptr = FreeImage.FreeImage_ConvertTo24Bits(self)
142
- FreeImage.check_last_error
143
- self.class.new(ptr, &block)
144
- end
145
-
146
- # :call-seq:
147
- # image.convert_to_32bits -> bitmap
148
- # image.convert_to_32bits {|img| block} -> bitmap
149
- #
150
- # Converts a bitmap to 32 bits. For 48-bit RGB images, conversion is done
151
- # by dividing each 16-bit channel by 256 and by setting the alpha channel
152
- # to an opaque value (0xFF). For 64-bit RGBA images, conversion is done
153
- # by dividing each 16-bit channel by 256. A nil value is returned for
154
- # other non-standard bitmap types.
155
- #
156
- # If an optional block is provided, it will be passed the new image as an argument. The
157
- # image will be automatically closed when the block completes.
158
- #
159
- def convert_to_32bits(&block)
160
- ptr = FreeImage.FreeImage_ConvertTo32Bits(self)
161
- FreeImage.check_last_error
162
- self.class.new(ptr, &block)
163
- end
164
-
165
- # :call-seq:
166
- # image.convert_to_standard_type(scale_linear = true) -> bitmap
167
- # image.convert_to_standard_type(scale_linear = true) {|img| block} -> bitmap
168
- #
169
- # Converts a non standard image whose color type is :minis_black to a
170
- # standard 8-bit greyscale image. When the scale_linear parameter is
171
- # true, conversion is done by scaling linearly each pixel value from [min, max]
172
- # to an integer value between [0..255], where min and max are the minimum
173
- # and maximum pixel values in the image. When scale_linear is false, conversion
174
- # is done by rounding each pixel value to an integer between [0..255]. Rounding
175
- # is done using the following formula:
176
- #
177
- # dst_pixel = (BYTE) MIN(255, MAX(0, q)) where int q = int(src_pixel + 0.5)
178
- #
179
- # For standard bitmaps, a clone of the original bitmap is returned.
180
- # For complex images, the magnitude is extracted as a double image and then converted
181
- # according to the scale parameter.
182
- #
183
- # If an optional block is provided, it will be passed the new image as an argument. The
184
- # image will be automatically closed when the block completes.
185
- #
186
- def convert_to_standard_type(scale_linear = true, &block)
187
- ptr = FreeImage.FreeImage_ConvertToStandardType(self, scale_linear)
188
- FreeImage.check_last_error
189
- self.class.new(ptr, &block)
190
- end
191
-
192
- # :call-seq:
193
- # image.convert_to_type(dst_image_type, scale_linear = true) -> bitmap
194
- # image.convert_to_type(dst_image_type, scale_linear = true) {|img| block} -> bitmap
195
- #
196
- # Converts a bitmap to the specified destination image type. When the image_type
197
- # is equal to :bitmap, the function calls FreeImage::Converstions#convert_to_standard_type.
198
- # Otherwise, conversion is done using standard C language casting conventions. When
199
- # a conversion is not allowed, a nil value is returned and an error is thrown.
200
- # Please refer to the FreeImage documentation for allowed conversions.
201
- #
202
- # If an optional block is provided, it will be passed the new image as an argument. The
203
- # image will be automatically closed when the block completes.
204
- #
205
- def convert_to_type(dst_image_type, scale_linear = true, &block)
206
- ptr = FreeImage.FreeImage_ConvertToType(self, dst_image_type, scale_linear)
207
- FreeImage.check_last_error
208
- self.class.new(ptr, &block)
209
- end
210
-
211
- # :call-seq:
212
- # image.dither(algorithm) -> bitmap
213
- # image.dither(algorithm) {|img| block} -> bitmap
214
- #
215
- # Converts a bitmap to 1-bit monochrome bitmap using the specified
216
- # {dithering}[rdoc-ref:FreeImage.dithers] algorithm. For 1-bit input
217
- # bitmaps, the function clones the input bitmap and builds a
218
- # monochrome palette. Otherwise the function first converts the
219
- # bitmap to a 8-bit greyscale bitmap.
220
- #
221
- # If an optional block is provided, it will be passed the new image as an argument. The
222
- # image will be automatically closed when the block completes.
223
- #
224
- def dither(algorithm, &block)
225
- ptr = FreeImage.FreeImage_Dither(self, algorithm)
226
- FreeImage.check_last_error
227
- self.class.new(ptr, &block)
228
- end
229
-
230
- # :call-seq:
231
- # image.threshold(value) -> bitmap
232
- # image.threshold(value) {|img| block} -> bitmap
233
- #
234
- # Converts a bitmap to 1-bit monochrome bitmap using a threshold value
235
- # between 0 and 255. The function first converts the bitmap to a 8-bit
236
- # greyscale bitmap. Then any brightness level that is less than the
237
- # threshold is set to zero and any value above is set to 1.
238
- # For 1-bit input bitmaps, the function clones the input bitmap and
239
- # builds a monochrome palette.
240
- #
241
- # If an optional block is provided, it will be passed the new image as an argument. The
242
- # image will be automatically closed when the block completes.
243
- #
244
- def threshold(value, &block)
245
- value = Integer(value)
246
- unless (0..255).include?(value)
247
- raise(RangeError, "Value is out of range 0..255. Value: #{value}")
248
- end
249
- ptr = FreeImage.FreeImage_Threshold(self, value)
250
- FreeImage.check_last_error
251
- self.class.new(ptr, &block)
252
- end
253
- end
1
+ module FreeImage
2
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo4Bits(FIBITMAP *dib);
3
+ attach_function('FreeImage_ConvertTo4Bits', [:pointer], :pointer)
4
+
5
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo8Bits(FIBITMAP *dib);
6
+ attach_function('FreeImage_ConvertTo8Bits', [:pointer], :pointer)
7
+
8
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToGreyscale(FIBITMAP *dib);
9
+ attach_function('FreeImage_ConvertToGreyscale', [:pointer], :pointer)
10
+
11
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo16Bits555(FIBITMAP *dib);
12
+ attach_function('FreeImage_ConvertTo16Bits555', [:pointer], :pointer)
13
+
14
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo16Bits565(FIBITMAP *dib);
15
+ attach_function('FreeImage_ConvertTo16Bits565', [:pointer], :pointer)
16
+
17
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo24Bits(FIBITMAP *dib);
18
+ attach_function('FreeImage_ConvertTo24Bits', [:pointer], :pointer)
19
+
20
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertTo32Bits(FIBITMAP *dib);
21
+ attach_function('FreeImage_ConvertTo32Bits', [:pointer], :pointer)
22
+
23
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_Dither(FIBITMAP *dib, FREE_IMAGE_DITHER algorithm);
24
+ attach_function('FreeImage_Dither', [:pointer, :dither], :pointer)
25
+
26
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_Threshold(FIBITMAP *dib, BYTE T);
27
+ attach_function('FreeImage_Threshold', [:pointer, :byte], :pointer)
28
+
29
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToStandardType(FIBITMAP *src, BOOL scale_linear FI_DEFAULT(TRUE));
30
+ attach_function('FreeImage_ConvertToStandardType', [:pointer, FreeImage::Boolean], :pointer)
31
+
32
+ #DLL_API FIBITMAP *DLL_CALLCONV FreeImage_ConvertToType(FIBITMAP *src, FREE_IMAGE_TYPE dst_type, BOOL scale_linear FI_DEFAULT(TRUE));
33
+ attach_function('FreeImage_ConvertToType', [:pointer, :image_type, FreeImage::Boolean], :pointer)
34
+
35
+ module Conversions
36
+ # :call-seq:
37
+ # image.convert_to_4bits -> bitmap
38
+ # image.convert_to_4bits {|img| block} -> bitmap
39
+ #
40
+ # Converts a bitmap to 4 bits. If the bitmap is a high-color (16, 24 or 32-bit),
41
+ # monochrome or greyscale bitmap (1 or 8-bit) the end result will be a greyscale bitmap.
42
+ # A 1-bit bitmap will become a palletized bitmap.
43
+ #
44
+ # Note that "greyscale" means that the resulting bitmap will have grey colors,
45
+ # but the palette won't be a linear greyscale palette. Thus, FreeImage::Bitmap.color_type
46
+ # will return a :palette.
47
+ #
48
+ # If an optional block is provided, it will be passed the new image as an argument. The
49
+ # image will be automatically closed when the block completes.
50
+ #
51
+ def convert_to_4bits(&block)
52
+ ptr = FreeImage.FreeImage_ConvertTo4Bits(self)
53
+ FreeImage.check_last_error
54
+ self.class.new(ptr, &block)
55
+ end
56
+
57
+ # :call-seq:
58
+ # image.convert_to_8bits -> bitmap
59
+ # image.convert_to_8bits {|img| block} -> bitmap
60
+ #
61
+ # Converts a bitmap to 8 bits. If the bitmap is a high-color (16, 24 or 32-bit),
62
+ # monochrome or greyscale bitmap (1 or 4-bit) the end result will be a greyscale bitmap.
63
+ # A 1-bit or 4-bit bitmap will become a palletized bitmap.
64
+ #
65
+ # For 16-bit greyscale images (images whose type is :uint16), conversion is done by
66
+ # dividing the 16-bit channel by 256 (see also FreeImage::Bitmap.ConvertToStandardType).
67
+ # A nil value is returned for other non-standard bitmap types.
68
+ #
69
+ # If an optional block is provided, it will be passed the new image as an argument. The
70
+ # image will be automatically closed when the block completes.
71
+ #
72
+ def convert_to_8bits(&block)
73
+ ptr = FreeImage.FreeImage_ConvertTo8Bits(self)
74
+ FreeImage.check_last_error
75
+ self.class.new(ptr, &block)
76
+ end
77
+
78
+ # :call-seq:
79
+ # image.convert_to_greyscale -> bitmap
80
+ # image.convert_to_greyscale {|img| block} -> bitmap
81
+ #
82
+ # Converts a bitmap to a 8-bit greyscale image with a linear ramp. Contrary to
83
+ # the FreeImage::Conversions#convert_to_8bits function, 1-, 4- and 8-bit palletized
84
+ # bitmaps are correctly converted, as well as images with a :minis_white color type.
85
+ #
86
+ # If an optional block is provided, it will be passed the new image as an argument. The
87
+ # image will be automatically closed when the block completes.
88
+ #
89
+ def convert_to_greyscale(&block)
90
+ ptr = FreeImage.FreeImage_ConvertToGreyscale(self)
91
+ FreeImage.check_last_error
92
+ self.class.new(ptr, &block)
93
+ end
94
+
95
+ # :call-seq:
96
+ # image.convert_to_16bits_555 -> bitmap
97
+ # image.convert_to_16bits_555 {|img| block} -> bitmap
98
+ #
99
+ # Converts a bitmap to 16 bits, where each pixel has a color pattern of
100
+ # 5 bits red, 5 bits green and 5 bits blue. One bit in each pixel is
101
+ # unused.
102
+ #
103
+ # If an optional block is provided, it will be passed the new image as an argument. The
104
+ # image will be automatically closed when the block completes.
105
+ #
106
+ def convert_to_16bits_555(&block)
107
+ ptr = FreeImage.FreeImage_ConvertTo16Bits555(self)
108
+ FreeImage.check_last_error
109
+ self.class.new(ptr, &block)
110
+ end
111
+
112
+ # :call-seq:
113
+ # image.convert_to_16bits_565 -> bitmap
114
+ # image.convert_to_16bits_565 {|img| block} -> bitmap
115
+ #
116
+ # Converts a bitmap to 16 bits, where each pixel has a color pattern of
117
+ # 5 bits red, 6 bits green and 5 bits blue. One bit in each pixel is
118
+ # unused.
119
+ #
120
+ # If an optional block is provided, it will be passed the new image as an argument. The
121
+ # image will be automatically closed when the block completes.
122
+ #
123
+ def convert_to_16bits_565(&block)
124
+ ptr = FreeImage.FreeImage_ConvertTo16Bits565(self)
125
+ FreeImage.check_last_error
126
+ self.class.new(ptr, &block)
127
+ end
128
+
129
+ # :call-seq:
130
+ # image.convert_to_24bits -> bitmap
131
+ # image.convert_to_24bits {|img| block} -> bitmap
132
+ #
133
+ # Converts a bitmap to 24 bits. For 48-bit RGB images, conversion is done
134
+ # by dividing each 16-bit channel by 256. A nil value is returned for
135
+ # other non-standard bitmap types.
136
+ #
137
+ # If an optional block is provided, it will be passed the new image as an argument. The
138
+ # image will be automatically closed when the block completes.
139
+ #
140
+ def convert_to_24bits(&block)
141
+ ptr = FreeImage.FreeImage_ConvertTo24Bits(self)
142
+ FreeImage.check_last_error
143
+ self.class.new(ptr, &block)
144
+ end
145
+
146
+ # :call-seq:
147
+ # image.convert_to_32bits -> bitmap
148
+ # image.convert_to_32bits {|img| block} -> bitmap
149
+ #
150
+ # Converts a bitmap to 32 bits. For 48-bit RGB images, conversion is done
151
+ # by dividing each 16-bit channel by 256 and by setting the alpha channel
152
+ # to an opaque value (0xFF). For 64-bit RGBA images, conversion is done
153
+ # by dividing each 16-bit channel by 256. A nil value is returned for
154
+ # other non-standard bitmap types.
155
+ #
156
+ # If an optional block is provided, it will be passed the new image as an argument. The
157
+ # image will be automatically closed when the block completes.
158
+ #
159
+ def convert_to_32bits(&block)
160
+ ptr = FreeImage.FreeImage_ConvertTo32Bits(self)
161
+ FreeImage.check_last_error
162
+ self.class.new(ptr, &block)
163
+ end
164
+
165
+ # :call-seq:
166
+ # image.convert_to_standard_type(scale_linear = true) -> bitmap
167
+ # image.convert_to_standard_type(scale_linear = true) {|img| block} -> bitmap
168
+ #
169
+ # Converts a non standard image whose color type is :minis_black to a
170
+ # standard 8-bit greyscale image. When the scale_linear parameter is
171
+ # true, conversion is done by scaling linearly each pixel value from [min, max]
172
+ # to an integer value between [0..255], where min and max are the minimum
173
+ # and maximum pixel values in the image. When scale_linear is false, conversion
174
+ # is done by rounding each pixel value to an integer between [0..255]. Rounding
175
+ # is done using the following formula:
176
+ #
177
+ # dst_pixel = (BYTE) MIN(255, MAX(0, q)) where int q = int(src_pixel + 0.5)
178
+ #
179
+ # For standard bitmaps, a clone of the original bitmap is returned.
180
+ # For complex images, the magnitude is extracted as a double image and then converted
181
+ # according to the scale parameter.
182
+ #
183
+ # If an optional block is provided, it will be passed the new image as an argument. The
184
+ # image will be automatically closed when the block completes.
185
+ #
186
+ def convert_to_standard_type(scale_linear = true, &block)
187
+ ptr = FreeImage.FreeImage_ConvertToStandardType(self, scale_linear)
188
+ FreeImage.check_last_error
189
+ self.class.new(ptr, &block)
190
+ end
191
+
192
+ # :call-seq:
193
+ # image.convert_to_type(dst_image_type, scale_linear = true) -> bitmap
194
+ # image.convert_to_type(dst_image_type, scale_linear = true) {|img| block} -> bitmap
195
+ #
196
+ # Converts a bitmap to the specified destination image type. When the image_type
197
+ # is equal to :bitmap, the function calls FreeImage::Converstions#convert_to_standard_type.
198
+ # Otherwise, conversion is done using standard C language casting conventions. When
199
+ # a conversion is not allowed, a nil value is returned and an error is thrown.
200
+ # Please refer to the FreeImage documentation for allowed conversions.
201
+ #
202
+ # If an optional block is provided, it will be passed the new image as an argument. The
203
+ # image will be automatically closed when the block completes.
204
+ #
205
+ def convert_to_type(dst_image_type, scale_linear = true, &block)
206
+ ptr = FreeImage.FreeImage_ConvertToType(self, dst_image_type, scale_linear)
207
+ FreeImage.check_last_error
208
+ self.class.new(ptr, &block)
209
+ end
210
+
211
+ # :call-seq:
212
+ # image.dither(algorithm) -> bitmap
213
+ # image.dither(algorithm) {|img| block} -> bitmap
214
+ #
215
+ # Converts a bitmap to 1-bit monochrome bitmap using the specified
216
+ # {dithering}[rdoc-ref:FreeImage.dithers] algorithm. For 1-bit input
217
+ # bitmaps, the function clones the input bitmap and builds a
218
+ # monochrome palette. Otherwise the function first converts the
219
+ # bitmap to a 8-bit greyscale bitmap.
220
+ #
221
+ # If an optional block is provided, it will be passed the new image as an argument. The
222
+ # image will be automatically closed when the block completes.
223
+ #
224
+ def dither(algorithm, &block)
225
+ ptr = FreeImage.FreeImage_Dither(self, algorithm)
226
+ FreeImage.check_last_error
227
+ self.class.new(ptr, &block)
228
+ end
229
+
230
+ # :call-seq:
231
+ # image.threshold(value) -> bitmap
232
+ # image.threshold(value) {|img| block} -> bitmap
233
+ #
234
+ # Converts a bitmap to 1-bit monochrome bitmap using a threshold value
235
+ # between 0 and 255. The function first converts the bitmap to a 8-bit
236
+ # greyscale bitmap. Then any brightness level that is less than the
237
+ # threshold is set to zero and any value above is set to 1.
238
+ # For 1-bit input bitmaps, the function clones the input bitmap and
239
+ # builds a monochrome palette.
240
+ #
241
+ # If an optional block is provided, it will be passed the new image as an argument. The
242
+ # image will be automatically closed when the block completes.
243
+ #
244
+ def threshold(value, &block)
245
+ value = Integer(value)
246
+ unless (0..255).include?(value)
247
+ raise(RangeError, "Value is out of range 0..255. Value: #{value}")
248
+ end
249
+ ptr = FreeImage.FreeImage_Threshold(self, value)
250
+ FreeImage.check_last_error
251
+ self.class.new(ptr, &block)
252
+ end
253
+ end
254
254
  end