rmagick-windows 2.16.1

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 (393) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +14 -0
  3. data/.gitignore +23 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +340 -0
  7. data/.simplecov +27 -0
  8. data/.travis.yml +60 -0
  9. data/CHANGELOG.md +915 -0
  10. data/CODE_OF_CONDUCT.md +13 -0
  11. data/CONTRIBUTING.md +50 -0
  12. data/Doxyfile +1514 -0
  13. data/Gemfile +10 -0
  14. data/LICENSE +20 -0
  15. data/README.textile +257 -0
  16. data/Rakefile +188 -0
  17. data/before_install_linux.sh +32 -0
  18. data/before_install_osx.sh +2 -0
  19. data/deprecated/RMagick.rb +6 -0
  20. data/doc/.cvsignore +1 -0
  21. data/doc/comtasks.html +287 -0
  22. data/doc/constants.html +1581 -0
  23. data/doc/css/doc.css +299 -0
  24. data/doc/css/popup.css +34 -0
  25. data/doc/css/ref.css +67 -0
  26. data/doc/draw.html +3272 -0
  27. data/doc/ex/InitialCoords.rb +22 -0
  28. data/doc/ex/NewCoordSys.rb +30 -0
  29. data/doc/ex/OrigCoordSys.rb +16 -0
  30. data/doc/ex/PreserveAspectRatio.rb +204 -0
  31. data/doc/ex/RotateScale.rb +36 -0
  32. data/doc/ex/Skew.rb +38 -0
  33. data/doc/ex/Use01.rb +15 -0
  34. data/doc/ex/Use02.rb +20 -0
  35. data/doc/ex/Use03.rb +16 -0
  36. data/doc/ex/ViewBox.rb +31 -0
  37. data/doc/ex/adaptive_threshold.rb +9 -0
  38. data/doc/ex/add_noise.rb +16 -0
  39. data/doc/ex/affine.rb +48 -0
  40. data/doc/ex/affine_transform.rb +20 -0
  41. data/doc/ex/arc.rb +49 -0
  42. data/doc/ex/arcpath.rb +32 -0
  43. data/doc/ex/arcs01.rb +28 -0
  44. data/doc/ex/arcs02.rb +59 -0
  45. data/doc/ex/average.rb +15 -0
  46. data/doc/ex/axes.rb +64 -0
  47. data/doc/ex/baseline_shift01.rb +17 -0
  48. data/doc/ex/bilevel_channel.rb +8 -0
  49. data/doc/ex/blur_image.rb +12 -0
  50. data/doc/ex/border.rb +10 -0
  51. data/doc/ex/bounding_box.rb +42 -0
  52. data/doc/ex/cbezier1.rb +41 -0
  53. data/doc/ex/cbezier2.rb +41 -0
  54. data/doc/ex/cbezier3.rb +41 -0
  55. data/doc/ex/cbezier4.rb +42 -0
  56. data/doc/ex/cbezier5.rb +42 -0
  57. data/doc/ex/cbezier6.rb +53 -0
  58. data/doc/ex/channel.rb +25 -0
  59. data/doc/ex/charcoal.rb +12 -0
  60. data/doc/ex/chop.rb +29 -0
  61. data/doc/ex/circle.rb +33 -0
  62. data/doc/ex/circle01.rb +16 -0
  63. data/doc/ex/clip_path.rb +60 -0
  64. data/doc/ex/coalesce.rb +57 -0
  65. data/doc/ex/color_fill_to_border.rb +29 -0
  66. data/doc/ex/color_floodfill.rb +28 -0
  67. data/doc/ex/color_histogram.rb +47 -0
  68. data/doc/ex/color_reset.rb +11 -0
  69. data/doc/ex/colorize.rb +16 -0
  70. data/doc/ex/colors.rb +64 -0
  71. data/doc/ex/compose_mask.rb +22 -0
  72. data/doc/ex/composite.rb +133 -0
  73. data/doc/ex/composite_layers.rb +53 -0
  74. data/doc/ex/composite_tiled.rb +21 -0
  75. data/doc/ex/contrast.rb +36 -0
  76. data/doc/ex/crop.rb +31 -0
  77. data/doc/ex/crop_with_gravity.rb +42 -0
  78. data/doc/ex/cubic01.rb +43 -0
  79. data/doc/ex/cubic02.rb +91 -0
  80. data/doc/ex/cycle_colormap.rb +21 -0
  81. data/doc/ex/dissolve.rb +12 -0
  82. data/doc/ex/drawcomp.rb +42 -0
  83. data/doc/ex/drop_shadow.rb +60 -0
  84. data/doc/ex/edge.rb +11 -0
  85. data/doc/ex/ellipse.rb +45 -0
  86. data/doc/ex/ellipse01.rb +21 -0
  87. data/doc/ex/emboss.rb +11 -0
  88. data/doc/ex/enhance.rb +28 -0
  89. data/doc/ex/equalize.rb +11 -0
  90. data/doc/ex/evenodd.rb +42 -0
  91. data/doc/ex/fill_pattern.rb +23 -0
  92. data/doc/ex/flatten_images.rb +36 -0
  93. data/doc/ex/flip.rb +11 -0
  94. data/doc/ex/flop.rb +11 -0
  95. data/doc/ex/font_styles.rb +32 -0
  96. data/doc/ex/fonts.rb +20 -0
  97. data/doc/ex/frame.rb +12 -0
  98. data/doc/ex/gaussian_blur.rb +11 -0
  99. data/doc/ex/get_multiline_type_metrics.rb +41 -0
  100. data/doc/ex/get_pixels.rb +47 -0
  101. data/doc/ex/get_type_metrics.rb +141 -0
  102. data/doc/ex/gradientfill.rb +27 -0
  103. data/doc/ex/grav.rb +45 -0
  104. data/doc/ex/gravity.rb +80 -0
  105. data/doc/ex/group.rb +26 -0
  106. data/doc/ex/hatchfill.rb +27 -0
  107. data/doc/ex/image.rb +44 -0
  108. data/doc/ex/images/Apple.miff +0 -0
  109. data/doc/ex/images/Ballerina.jpg +0 -0
  110. data/doc/ex/images/Ballerina3.jpg +0 -0
  111. data/doc/ex/images/Button_0.gif +0 -0
  112. data/doc/ex/images/Button_1.gif +0 -0
  113. data/doc/ex/images/Button_2.gif +0 -0
  114. data/doc/ex/images/Button_3.gif +0 -0
  115. data/doc/ex/images/Button_4.gif +0 -0
  116. data/doc/ex/images/Button_5.gif +0 -0
  117. data/doc/ex/images/Button_6.gif +0 -0
  118. data/doc/ex/images/Button_7.gif +0 -0
  119. data/doc/ex/images/Button_8.gif +0 -0
  120. data/doc/ex/images/Button_9.gif +0 -0
  121. data/doc/ex/images/Button_A.gif +0 -0
  122. data/doc/ex/images/Button_B.gif +0 -0
  123. data/doc/ex/images/Button_C.gif +0 -0
  124. data/doc/ex/images/Button_D.gif +0 -0
  125. data/doc/ex/images/Button_E.gif +0 -0
  126. data/doc/ex/images/Button_F.gif +0 -0
  127. data/doc/ex/images/Button_G.gif +0 -0
  128. data/doc/ex/images/Button_H.gif +0 -0
  129. data/doc/ex/images/Button_I.gif +0 -0
  130. data/doc/ex/images/Button_J.gif +0 -0
  131. data/doc/ex/images/Button_K.gif +0 -0
  132. data/doc/ex/images/Button_L.gif +0 -0
  133. data/doc/ex/images/Button_M.gif +0 -0
  134. data/doc/ex/images/Button_N.gif +0 -0
  135. data/doc/ex/images/Button_O.gif +0 -0
  136. data/doc/ex/images/Button_P.gif +0 -0
  137. data/doc/ex/images/Button_Q.gif +0 -0
  138. data/doc/ex/images/Button_R.gif +0 -0
  139. data/doc/ex/images/Button_S.gif +0 -0
  140. data/doc/ex/images/Button_T.gif +0 -0
  141. data/doc/ex/images/Button_U.gif +0 -0
  142. data/doc/ex/images/Button_V.gif +0 -0
  143. data/doc/ex/images/Button_W.gif +0 -0
  144. data/doc/ex/images/Button_X.gif +0 -0
  145. data/doc/ex/images/Button_Y.gif +0 -0
  146. data/doc/ex/images/Button_Z.gif +0 -0
  147. data/doc/ex/images/Cheetah.jpg +0 -0
  148. data/doc/ex/images/Coffee.wmf +0 -0
  149. data/doc/ex/images/Flower_Hat.jpg +0 -0
  150. data/doc/ex/images/Gold_Statue.jpg +0 -0
  151. data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
  152. data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
  153. data/doc/ex/images/Leaf.miff +0 -0
  154. data/doc/ex/images/No.wmf +0 -0
  155. data/doc/ex/images/Polynesia.jpg +0 -0
  156. data/doc/ex/images/Red_Rocks.jpg +0 -0
  157. data/doc/ex/images/Rocks_On_Beach.miff +0 -0
  158. data/doc/ex/images/Shorts.jpg +0 -0
  159. data/doc/ex/images/Snake.wmf +0 -0
  160. data/doc/ex/images/Violin.jpg +0 -0
  161. data/doc/ex/images/Yellow_Rose.miff +0 -0
  162. data/doc/ex/images/big-duck.gif +0 -0
  163. data/doc/ex/images/duck.gif +0 -0
  164. data/doc/ex/images/duck0.gif +0 -0
  165. data/doc/ex/images/duck1.gif +0 -0
  166. data/doc/ex/images/duck10.gif +0 -0
  167. data/doc/ex/images/duck11.gif +0 -0
  168. data/doc/ex/images/duck12.gif +0 -0
  169. data/doc/ex/images/duck13.gif +0 -0
  170. data/doc/ex/images/duck14.gif +0 -0
  171. data/doc/ex/images/duck15.gif +0 -0
  172. data/doc/ex/images/duck2.gif +0 -0
  173. data/doc/ex/images/duck3.gif +0 -0
  174. data/doc/ex/images/duck4.gif +0 -0
  175. data/doc/ex/images/duck5.gif +0 -0
  176. data/doc/ex/images/duck6.gif +0 -0
  177. data/doc/ex/images/duck7.gif +0 -0
  178. data/doc/ex/images/duck8.gif +0 -0
  179. data/doc/ex/images/duck9.gif +0 -0
  180. data/doc/ex/images/graydient230x6.gif +0 -0
  181. data/doc/ex/images/image_with_profile.jpg +0 -0
  182. data/doc/ex/images/logo400x83.gif +0 -0
  183. data/doc/ex/images/model.miff +0 -0
  184. data/doc/ex/images/notimplemented.gif +0 -0
  185. data/doc/ex/images/smile.miff +0 -0
  186. data/doc/ex/images/spin.gif +0 -0
  187. data/doc/ex/implode.rb +34 -0
  188. data/doc/ex/level.rb +11 -0
  189. data/doc/ex/level_colors.rb +11 -0
  190. data/doc/ex/line.rb +41 -0
  191. data/doc/ex/line01.rb +21 -0
  192. data/doc/ex/mask.rb +35 -0
  193. data/doc/ex/matte_fill_to_border.rb +39 -0
  194. data/doc/ex/matte_floodfill.rb +32 -0
  195. data/doc/ex/matte_replace.rb +39 -0
  196. data/doc/ex/median_filter.rb +28 -0
  197. data/doc/ex/modulate.rb +11 -0
  198. data/doc/ex/mono.rb +23 -0
  199. data/doc/ex/morph.rb +25 -0
  200. data/doc/ex/mosaic.rb +35 -0
  201. data/doc/ex/motion_blur.rb +11 -0
  202. data/doc/ex/negate.rb +11 -0
  203. data/doc/ex/negate_channel.rb +9 -0
  204. data/doc/ex/nested_rvg.rb +21 -0
  205. data/doc/ex/nonzero.rb +42 -0
  206. data/doc/ex/normalize.rb +11 -0
  207. data/doc/ex/oil_paint.rb +11 -0
  208. data/doc/ex/opacity.rb +37 -0
  209. data/doc/ex/ordered_dither.rb +11 -0
  210. data/doc/ex/path.rb +63 -0
  211. data/doc/ex/pattern1.rb +25 -0
  212. data/doc/ex/pattern2.rb +26 -0
  213. data/doc/ex/polaroid.rb +27 -0
  214. data/doc/ex/polygon.rb +23 -0
  215. data/doc/ex/polygon01.rb +21 -0
  216. data/doc/ex/polyline.rb +22 -0
  217. data/doc/ex/polyline01.rb +21 -0
  218. data/doc/ex/posterize.rb +8 -0
  219. data/doc/ex/preview.rb +8 -0
  220. data/doc/ex/qbezierpath.rb +52 -0
  221. data/doc/ex/quad01.rb +34 -0
  222. data/doc/ex/quantize-m.rb +25 -0
  223. data/doc/ex/radial_blur.rb +9 -0
  224. data/doc/ex/raise.rb +8 -0
  225. data/doc/ex/random_threshold_channel.rb +13 -0
  226. data/doc/ex/rect01.rb +14 -0
  227. data/doc/ex/rect02.rb +20 -0
  228. data/doc/ex/rectangle.rb +34 -0
  229. data/doc/ex/reduce_noise.rb +28 -0
  230. data/doc/ex/remap.rb +11 -0
  231. data/doc/ex/remap_images.rb +19 -0
  232. data/doc/ex/resize_to_fill.rb +8 -0
  233. data/doc/ex/resize_to_fit.rb +8 -0
  234. data/doc/ex/roll.rb +9 -0
  235. data/doc/ex/rotate.rb +44 -0
  236. data/doc/ex/rotate_f.rb +14 -0
  237. data/doc/ex/roundrect.rb +33 -0
  238. data/doc/ex/rubyname.rb +30 -0
  239. data/doc/ex/rvg_clippath.rb +12 -0
  240. data/doc/ex/rvg_linecap.rb +42 -0
  241. data/doc/ex/rvg_linejoin.rb +40 -0
  242. data/doc/ex/rvg_opacity.rb +18 -0
  243. data/doc/ex/rvg_pattern.rb +26 -0
  244. data/doc/ex/rvg_stroke_dasharray.rb +11 -0
  245. data/doc/ex/segment.rb +11 -0
  246. data/doc/ex/sepiatone.rb +7 -0
  247. data/doc/ex/shade.rb +11 -0
  248. data/doc/ex/shadow.rb +30 -0
  249. data/doc/ex/shave.rb +15 -0
  250. data/doc/ex/shear.rb +10 -0
  251. data/doc/ex/sketch.rb +17 -0
  252. data/doc/ex/skewx.rb +51 -0
  253. data/doc/ex/skewy.rb +47 -0
  254. data/doc/ex/smile.rb +125 -0
  255. data/doc/ex/solarize.rb +11 -0
  256. data/doc/ex/sparse_color.rb +54 -0
  257. data/doc/ex/splice.rb +8 -0
  258. data/doc/ex/spread.rb +11 -0
  259. data/doc/ex/stegano.rb +55 -0
  260. data/doc/ex/stroke_dasharray.rb +42 -0
  261. data/doc/ex/stroke_fill.rb +10 -0
  262. data/doc/ex/stroke_linecap.rb +44 -0
  263. data/doc/ex/stroke_linejoin.rb +48 -0
  264. data/doc/ex/stroke_width.rb +49 -0
  265. data/doc/ex/swirl.rb +17 -0
  266. data/doc/ex/text.rb +37 -0
  267. data/doc/ex/text01.rb +16 -0
  268. data/doc/ex/text_align.rb +36 -0
  269. data/doc/ex/text_antialias.rb +37 -0
  270. data/doc/ex/text_styles.rb +19 -0
  271. data/doc/ex/text_undercolor.rb +28 -0
  272. data/doc/ex/texture_fill_to_border.rb +34 -0
  273. data/doc/ex/texture_floodfill.rb +32 -0
  274. data/doc/ex/texturefill.rb +24 -0
  275. data/doc/ex/threshold.rb +13 -0
  276. data/doc/ex/to_blob.rb +13 -0
  277. data/doc/ex/translate.rb +39 -0
  278. data/doc/ex/transparent.rb +38 -0
  279. data/doc/ex/transpose.rb +9 -0
  280. data/doc/ex/transverse.rb +9 -0
  281. data/doc/ex/tref01.rb +24 -0
  282. data/doc/ex/triangle01.rb +15 -0
  283. data/doc/ex/trim.rb +23 -0
  284. data/doc/ex/tspan01.rb +17 -0
  285. data/doc/ex/tspan02.rb +17 -0
  286. data/doc/ex/tspan03.rb +19 -0
  287. data/doc/ex/unsharp_mask.rb +28 -0
  288. data/doc/ex/viewex.rb +33 -0
  289. data/doc/ex/vignette.rb +12 -0
  290. data/doc/ex/watermark.rb +27 -0
  291. data/doc/ex/wave.rb +9 -0
  292. data/doc/ex/wet_floor.rb +58 -0
  293. data/doc/ex/writing_mode01.rb +26 -0
  294. data/doc/ex/writing_mode02.rb +26 -0
  295. data/doc/ilist.html +2056 -0
  296. data/doc/image1.html +4680 -0
  297. data/doc/image2.html +3665 -0
  298. data/doc/image3.html +4522 -0
  299. data/doc/imageattrs.html +1638 -0
  300. data/doc/imusage.html +514 -0
  301. data/doc/index.html +416 -0
  302. data/doc/info.html +1499 -0
  303. data/doc/magick.html +565 -0
  304. data/doc/optequiv.html +2435 -0
  305. data/doc/rvg.html +975 -0
  306. data/doc/rvgclip.html +248 -0
  307. data/doc/rvggroup.html +305 -0
  308. data/doc/rvgimage.html +289 -0
  309. data/doc/rvgpattern.html +475 -0
  310. data/doc/rvgshape.html +406 -0
  311. data/doc/rvgstyle.html +270 -0
  312. data/doc/rvgtext.html +465 -0
  313. data/doc/rvgtspan.html +238 -0
  314. data/doc/rvgtut.html +530 -0
  315. data/doc/rvguse.html +145 -0
  316. data/doc/rvgxform.html +294 -0
  317. data/doc/scripts/doc.js +22 -0
  318. data/doc/scripts/stripeTables.js +23 -0
  319. data/doc/struct.html +1339 -0
  320. data/doc/usage.html +1621 -0
  321. data/examples/constitute.rb +7 -0
  322. data/examples/crop_with_gravity.rb +42 -0
  323. data/examples/demo.rb +324 -0
  324. data/examples/describe.rb +43 -0
  325. data/examples/find_similar_region.rb +34 -0
  326. data/examples/histogram.rb +321 -0
  327. data/examples/identify.rb +185 -0
  328. data/examples/image_opacity.rb +29 -0
  329. data/examples/import_export.rb +31 -0
  330. data/examples/pattern_fill.rb +38 -0
  331. data/examples/rotating_text.rb +44 -0
  332. data/examples/spinner.rb +49 -0
  333. data/examples/thumbnail.rb +64 -0
  334. data/examples/vignette.rb +78 -0
  335. data/ext/RMagick/extconf.rb +548 -0
  336. data/ext/RMagick/rmagick.c +401 -0
  337. data/ext/RMagick/rmagick.h +1287 -0
  338. data/ext/RMagick/rmdraw.c +2022 -0
  339. data/ext/RMagick/rmenum.c +1235 -0
  340. data/ext/RMagick/rmfill.c +720 -0
  341. data/ext/RMagick/rmilist.c +1270 -0
  342. data/ext/RMagick/rmimage.c +15427 -0
  343. data/ext/RMagick/rminfo.c +2590 -0
  344. data/ext/RMagick/rmmain.c +1741 -0
  345. data/ext/RMagick/rmmontage.c +519 -0
  346. data/ext/RMagick/rmpixel.c +1114 -0
  347. data/ext/RMagick/rmstruct.c +1124 -0
  348. data/ext/RMagick/rmutil.c +1754 -0
  349. data/lib/rmagick.rb +1 -0
  350. data/lib/rmagick/version.rb +6 -0
  351. data/lib/rmagick_internal.rb +1947 -0
  352. data/lib/rvg/clippath.rb +45 -0
  353. data/lib/rvg/container.rb +122 -0
  354. data/lib/rvg/deep_equal.rb +52 -0
  355. data/lib/rvg/describable.rb +47 -0
  356. data/lib/rvg/embellishable.rb +391 -0
  357. data/lib/rvg/misc.rb +723 -0
  358. data/lib/rvg/paint.rb +50 -0
  359. data/lib/rvg/pathdata.rb +126 -0
  360. data/lib/rvg/rvg.rb +283 -0
  361. data/lib/rvg/stretchable.rb +165 -0
  362. data/lib/rvg/stylable.rb +116 -0
  363. data/lib/rvg/text.rb +172 -0
  364. data/lib/rvg/transformable.rb +126 -0
  365. data/lib/rvg/units.rb +63 -0
  366. data/rmagick.gemspec +46 -0
  367. data/spec/rmagick/ImageList1_spec.rb +24 -0
  368. data/spec/rmagick/draw_spec.rb +156 -0
  369. data/spec/rmagick/image/blue_shift_spec.rb +16 -0
  370. data/spec/rmagick/image/composite_spec.rb +140 -0
  371. data/spec/rmagick/image/constitute_spec.rb +15 -0
  372. data/spec/rmagick/image/dispatch_spec.rb +18 -0
  373. data/spec/rmagick/image/from_blob_spec.rb +14 -0
  374. data/spec/rmagick/image/ping_spec.rb +14 -0
  375. data/spec/rmagick/image/properties_spec.rb +29 -0
  376. data/spec/spec_helper.rb +4 -0
  377. data/test/Image1.rb +565 -0
  378. data/test/Image2.rb +1304 -0
  379. data/test/Image3.rb +1030 -0
  380. data/test/ImageList1.rb +806 -0
  381. data/test/ImageList2.rb +385 -0
  382. data/test/Image_attributes.rb +697 -0
  383. data/test/Import_Export.rb +121 -0
  384. data/test/Info.rb +345 -0
  385. data/test/Magick.rb +321 -0
  386. data/test/Pixel.rb +116 -0
  387. data/test/Preview.rb +57 -0
  388. data/test/cmyk.icm +0 -0
  389. data/test/srgb.icm +0 -0
  390. data/test/test_all_basic.rb +38 -0
  391. data/test/tmpnam_test.rb +50 -0
  392. data/wercker.yml +10 -0
  393. metadata +509 -0
@@ -0,0 +1,321 @@
1
+ # This routine needs the color_histogram method
2
+ # from either ImageMagick 6.0.0 or GraphicsMagick 1.1
3
+ # Specify an image filename as an argument.
4
+
5
+ require 'rmagick'
6
+
7
+ class PixelColumn < Array
8
+ def initialize(size)
9
+ super
10
+ fill {Magick::Pixel.new}
11
+ end
12
+
13
+ def reset(bg)
14
+ each {|pixel| pixel.reset(bg)}
15
+ end
16
+ end
17
+
18
+ module Magick
19
+ class Pixel
20
+ def reset(bg)
21
+ self.red = bg.red
22
+ self.green = bg.green
23
+ self.blue = bg.blue
24
+ self.opacity = bg.opacity
25
+ end
26
+ end
27
+
28
+ class Image
29
+ private
30
+
31
+ HISTOGRAM_COLS = 256
32
+ HISTOGRAM_ROWS = 200
33
+ MAX_QUANTUM = 255
34
+ AIR_FACTOR = 1.025
35
+
36
+ # The alpha frequencies are shown as white dots.
37
+ def alpha_hist(freqs, scale, fg, bg)
38
+ histogram = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) do
39
+ self.background_color = bg
40
+ self.border_color = fg
41
+ end
42
+
43
+ gc = Draw.new
44
+ gc.affine(1, 0, 0, -scale, 0, HISTOGRAM_ROWS)
45
+ gc.fill('white')
46
+
47
+ HISTOGRAM_COLS.times do |x|
48
+ gc.point(x, freqs[x])
49
+ end
50
+
51
+ gc.draw(histogram)
52
+ histogram['Label'] = 'Alpha'
53
+
54
+ histogram
55
+ end
56
+
57
+ def channel_histograms(red, green, blue, int, scale, fg, bg)
58
+ rgb_histogram = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) do
59
+ self.background_color = bg
60
+ self.border_color = fg
61
+ end
62
+ rgb_histogram['Label'] = 'RGB'
63
+ red_histogram = rgb_histogram.copy
64
+ red_histogram['Label'] = 'Red'
65
+ green_histogram = rgb_histogram.copy
66
+ green_histogram['Label'] = 'Green'
67
+ blue_histogram = rgb_histogram.copy
68
+ blue_histogram['Label'] = 'Blue'
69
+ int_histogram = rgb_histogram.copy
70
+ int_histogram['Label'] = 'Intensity'
71
+ int_histogram.matte = true
72
+
73
+ rgb_column = PixelColumn.new(HISTOGRAM_ROWS)
74
+ red_column = PixelColumn.new(HISTOGRAM_ROWS)
75
+ green_column = PixelColumn.new(HISTOGRAM_ROWS)
76
+ blue_column = PixelColumn.new(HISTOGRAM_ROWS)
77
+ int_column = PixelColumn.new(HISTOGRAM_ROWS)
78
+
79
+ HISTOGRAM_COLS.times do |x|
80
+ HISTOGRAM_ROWS.times do |y|
81
+ yf = Float(y)
82
+ if yf >= HISTOGRAM_ROWS - (red[x] * scale)
83
+ red_column[y].red = QuantumRange
84
+ red_column[y].green = 0
85
+ red_column[y].blue = 0
86
+ rgb_column[y].red = QuantumRange
87
+ end
88
+ if yf >= HISTOGRAM_ROWS - (green[x] * scale)
89
+ green_column[y].green = QuantumRange
90
+ green_column[y].red = 0
91
+ green_column[y].blue = 0
92
+ rgb_column[y].green = QuantumRange
93
+ end
94
+ if yf >= HISTOGRAM_ROWS - (blue[x] * scale)
95
+ blue_column[y].blue = QuantumRange
96
+ blue_column[y].red = 0
97
+ blue_column[y].green = 0
98
+ rgb_column[y].blue = QuantumRange
99
+ end
100
+ if yf >= HISTOGRAM_ROWS - (int[x] * scale)
101
+ int_column[y].opacity = TransparentOpacity
102
+ end
103
+ end
104
+
105
+ rgb_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, rgb_column)
106
+ red_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, red_column)
107
+ green_histogram.store_pixels(x, 0, 1, HISTOGRAM_ROWS, green_column)
108
+ blue_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, blue_column)
109
+ int_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, int_column)
110
+ rgb_column.reset(bg)
111
+ red_column.reset(bg)
112
+ green_column.reset(bg)
113
+ blue_column.reset(bg)
114
+ int_column.reset(bg)
115
+ end
116
+
117
+ [red_histogram, green_histogram, blue_histogram, rgb_histogram, int_histogram]
118
+ end
119
+
120
+ # Make the color histogram. Quantize the image to 256 colors if necessary.
121
+ def color_hist(fg, bg)
122
+ img = number_colors > 256 ? quantize(256) : self
123
+
124
+ begin
125
+ hist = img.color_histogram
126
+ rescue NotImplementedError
127
+ $stderr.puts 'The color_histogram method is not supported by this version '\
128
+ 'of ImageMagick/GraphicsMagick'
129
+
130
+ else
131
+ pixels = hist.keys.sort_by {|pixel| hist[pixel] }
132
+ scale = HISTOGRAM_ROWS / (hist.values.max*AIR_FACTOR)
133
+
134
+ histogram = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) do
135
+ self.background_color = bg
136
+ self.border_color = fg
137
+ end
138
+
139
+ x = 0
140
+ pixels.each do |pixel|
141
+ column = Array.new(HISTOGRAM_ROWS).fill {Pixel.new}
142
+ HISTOGRAM_ROWS.times do |y|
143
+ if y >= HISTOGRAM_ROWS - (hist[pixel] * scale)
144
+ column[y] = pixel
145
+ end
146
+ end
147
+ histogram.store_pixels(x, 0, 1, HISTOGRAM_ROWS, column)
148
+ x = x.succ
149
+ end
150
+
151
+ histogram['Label'] = 'Color Frequency'
152
+ return histogram
153
+ end
154
+ end
155
+
156
+ # Use AnnotateImage to write the stats.
157
+ def info_text(fg, bg)
158
+ klass = class_type == DirectClass ? 'DirectClass' : 'PsuedoClass'
159
+
160
+ text = <<-END_TEXT
161
+ Format: #{format}
162
+ Geometry: #{columns}x#{rows}
163
+ Class: #{klass}
164
+ Depth: #{depth} bits-per-pixel component
165
+ Colors: #{number_colors}
166
+ END_TEXT
167
+
168
+ info = Image.new(HISTOGRAM_COLS, HISTOGRAM_ROWS) do
169
+ self.background_color = bg
170
+ self.border_color = fg
171
+ end
172
+
173
+ gc = Draw.new
174
+
175
+ gc.annotate(info, 0, 0, 0, 0, text) do
176
+ self.stroke = 'transparent'
177
+ self.fill = fg
178
+ self.gravity = CenterGravity
179
+ end
180
+ info['Label'] = 'Info'
181
+
182
+ info
183
+ end
184
+
185
+ def intensity_hist(int_histogram)
186
+ gradient = (Image.read('gradient:#ffff80-#ff9000') { self.size="#{HISTOGRAM_COLS}x#{HISTOGRAM_ROWS}" }).first
187
+ int_histogram = gradient.composite(int_histogram, CenterGravity, OverCompositeOp)
188
+
189
+ int_histogram['Label'] = 'Intensity'
190
+
191
+ int_histogram
192
+ end
193
+
194
+ # Returns a value between 0 and MAX_QUANTUM. Same as the PixelIntensity macro.
195
+ def pixel_intensity(pixel)
196
+ (306*(pixel.red & MAX_QUANTUM) + 601*(pixel.green & MAX_QUANTUM) + 117*(pixel.blue & MAX_QUANTUM))/1024
197
+ end
198
+
199
+ public
200
+
201
+ # Create the histogram montage.
202
+ def histogram(fg='white', bg='black')
203
+ red = Array.new(HISTOGRAM_COLS, 0)
204
+ green = Array.new(HISTOGRAM_COLS, 0)
205
+ blue = Array.new(HISTOGRAM_COLS, 0)
206
+ alpha = Array.new(HISTOGRAM_COLS, 0)
207
+ int = Array.new(HISTOGRAM_COLS, 0)
208
+
209
+ rows.times do |row|
210
+ pixels = get_pixels(0, row, columns, 1)
211
+ pixels.each do |pixel|
212
+ red[pixel.red & MAX_QUANTUM] += 1
213
+ green[pixel.green & MAX_QUANTUM] += 1
214
+ blue[pixel.blue & MAX_QUANTUM] += 1
215
+
216
+ # Only count opacity channel if some pixels are not opaque.
217
+ unless opaque?
218
+ alpha[pixel.opacity & MAX_QUANTUM] += 1
219
+ end
220
+ v = pixel_intensity(pixel)
221
+ int[v] += 1
222
+ end
223
+ end
224
+
225
+ # Scale to chart size. When computing the scale, add some "air" between
226
+ # the max frequency and the top of the histogram. This makes a prettier chart.
227
+ # The RGBA and intensity histograms are all drawn to the same scale.
228
+
229
+ max = [red.max, green.max, blue.max, alpha.max, int.max].max
230
+ scale = HISTOGRAM_ROWS / (max*AIR_FACTOR)
231
+
232
+ charts = ImageList.new
233
+
234
+ # Add the thumbnail.
235
+ thumb = copy
236
+ thumb['Label'] = File.basename(filename)
237
+ charts << thumb
238
+
239
+ # Compute the channel and intensity histograms.
240
+ channel_hists = channel_histograms(red, green, blue, int, scale, fg, bg)
241
+
242
+ # Add the red, green, and blue histograms to the list
243
+ charts << channel_hists.shift
244
+ charts << channel_hists.shift
245
+ charts << channel_hists.shift
246
+
247
+ # Add Alpha channel or image stats
248
+ if !opaque?
249
+ charts << alpha_hist(alpha, scale, fg, bg)
250
+ else
251
+ charts << info_text(fg, bg)
252
+ end
253
+
254
+ # Add the RGB histogram
255
+ charts << channel_hists.shift
256
+
257
+ # Add the intensity histogram.
258
+ charts << intensity_hist(channel_hists.shift)
259
+
260
+ # Add the color frequency histogram.
261
+ charts << color_hist(fg, bg)
262
+
263
+ # Make a montage.
264
+ histogram = charts.montage do
265
+ self.background_color = bg
266
+ self.stroke = 'transparent'
267
+ self.fill = fg
268
+ self.border_width = 1
269
+ self.tile = '4x2'
270
+ self.geometry = "#{HISTOGRAM_COLS}x#{HISTOGRAM_ROWS}+10+10"
271
+ end
272
+
273
+ histogram
274
+ end
275
+ end
276
+ end
277
+
278
+ puts <<END_INFO
279
+
280
+ This example shows how to get pixel-level access to an image.
281
+ Usage: histogram.rb <image-filename>
282
+
283
+ END_INFO
284
+
285
+ # Get filename from command line.
286
+ if !ARGV[0]
287
+ puts 'No filename argument. Defaulting to Flower_Hat.jpg'
288
+ filename = '../doc/ex/images/Flower_Hat.jpg'
289
+ else
290
+ filename = ARGV[0]
291
+ end
292
+
293
+ # Only process first frame if multi-frame image
294
+ image = Magick::Image.read(filename)
295
+ if image.length > 1
296
+ puts 'Charting 1st image'
297
+ end
298
+ image = image.first
299
+
300
+ # Give the user something to look at while we're working.
301
+ name = File.basename(filename).sub(/\..*?$/,'')
302
+ $defout.sync = true
303
+ printf "Creating #{name}_Histogram.miff"
304
+
305
+ timer = Thread.new do
306
+ loop do
307
+ sleep(1)
308
+ printf '.'
309
+ end
310
+ end
311
+
312
+ # Generate the histograms
313
+ histogram = image.histogram(Magick::Pixel.from_color('white'), Magick::Pixel.from_color('black'))
314
+
315
+ # Write output file
316
+ histogram.compression = Magick::ZipCompression
317
+ histogram.write("./#{name}_Histogram.miff")
318
+
319
+ Thread.kill(timer)
320
+ puts 'Done!'
321
+ exit
@@ -0,0 +1,185 @@
1
+ require 'rmagick'
2
+
3
+ module Magick
4
+ class Image
5
+ # Print information similar to the identify -verbose command
6
+ def identify
7
+ printf 'Image: '
8
+ puts "#{base_filename}=>" if base_filename != filename
9
+ puts filename + "\n"
10
+ puts "\tFormat: #{format}\n"
11
+ puts "\tGeometry: #{columns}x#{rows}\n"
12
+ puts "\tClass: #{class_type}\n"
13
+ puts "\tType: #{image_type}\n"
14
+ puts "\tEndianess: #{endian}\n"
15
+ puts "\tColorspace: #{colorspace}\n"
16
+ puts "\tChannelDepth:\n"
17
+ color_space = gray? ? Magick::GrayColorspace : colorspace
18
+ case color_space
19
+ when Magick::RGBColorspace
20
+ puts "\t\tRed: #{channel_depth(Magick::RedChannel)}-bits\n"
21
+ puts "\t\tGreen: #{channel_depth(Magick::GreenChannel)}-bits\n"
22
+ puts "\t\tBlue: #{channel_depth(Magick::BlueChannel)}-bits\n"
23
+ puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
24
+ when Magick::CMYKColorspace
25
+ puts "\t\tCyan : #{channel_depth(Magick::CyanChannel)}-bits\n"
26
+ puts "\t\tMagenta: #{channel_depth(Magick::MagentaChannel)}-bits\n"
27
+ puts "\t\tYellow: #{channel_depth(Magick::YellowChannel)}-bits\n"
28
+ puts "\t\tBlack: #{channel_depth(Magick::BlackChannel)}-bits\n"
29
+ puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
30
+ when Magick::GrayColorspace
31
+ puts "\t\tGray: #{channel_depth(Magick::GrayChannel)}-bits\n"
32
+ puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
33
+ end
34
+ scale = Magick::QuantumRange / (Magick::QuantumRange >> (Magick::MAGICKCORE_QUANTUM_DEPTH-channel_depth))
35
+ puts "\tChannel statistics:\n"
36
+ case color_space
37
+ when Magick::RGBColorspace
38
+ puts "\t\tRed:\n"
39
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[0]/scale, channel_extrema(Magick::RedChannel)[0]/Magick::QuantumRange)
40
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[1]/scale, channel_extrema(Magick::RedChannel)[1]/Magick::QuantumRange)
41
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[0]/scale, channel_mean(Magick::RedChannel)[0]/Magick::QuantumRange)
42
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[1]/scale, channel_mean(Magick::RedChannel)[1]/Magick::QuantumRange)
43
+ puts "\t\tGreen:\n"
44
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[0]/scale, channel_extrema(Magick::GreenChannel)[0]/Magick::QuantumRange)
45
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[1]/scale, channel_extrema(Magick::GreenChannel)[1]/Magick::QuantumRange)
46
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[0]/scale, channel_mean(Magick::GreenChannel)[0]/Magick::QuantumRange)
47
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[1]/scale, channel_mean(Magick::GreenChannel)[1]/Magick::QuantumRange)
48
+ puts "\t\tBlue:\n"
49
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[0]/scale, channel_extrema(Magick::BlueChannel)[0]/Magick::QuantumRange)
50
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[1]/scale, channel_extrema(Magick::BlueChannel)[1]/Magick::QuantumRange)
51
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[0]/scale, channel_mean(Magick::BlueChannel)[0]/Magick::QuantumRange)
52
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[1]/scale, channel_mean(Magick::BlueChannel)[1]/Magick::QuantumRange)
53
+ when Magick::CMYKColorspace
54
+ puts "\t\tCyan:\n"
55
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[0]/scale, channel_extrema(Magick::CyanChannel)[0]/Magick::QuantumRange)
56
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[1]/scale, channel_extrema(Magick::CyanChannel)[1]/Magick::QuantumRange)
57
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[0]/scale, channel_mean(Magick::CyanChannel)[0]/Magick::QuantumRange)
58
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[1]/scale, channel_mean(Magick::CyanChannel)[1]/Magick::QuantumRange)
59
+ puts "\t\tMagenta:\n"
60
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[0]/scale, channel_extrema(Magick::MagentaChannel)[0]/Magick::QuantumRange)
61
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[1]/scale, channel_extrema(Magick::MagentaChannel)[1]/Magick::QuantumRange)
62
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[0]/scale, channel_mean(Magick::MagentaChannel)[0]/Magick::QuantumRange)
63
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[1]/scale, channel_mean(Magick::MagentaChannel)[1]/Magick::QuantumRange)
64
+ puts "\t\tYellow:\n"
65
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[0]/scale, channel_extrema(Magick::YellowChannel)[0]/Magick::QuantumRange)
66
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[1]/scale, channel_extrema(Magick::YellowChannel)[1]/Magick::QuantumRange)
67
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[0]/scale, channel_mean(Magick::YellowChannel)[0]/Magick::QuantumRange)
68
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[1]/scale, channel_mean(Magick::YellowChannel)[1]/Magick::QuantumRange)
69
+ puts "\t\tBlack:\n"
70
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[0]/scale, channel_extrema(Magick::BlackChannel)[0]/Magick::QuantumRange)
71
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[1]/scale, channel_extrema(Magick::BlackChannel)[1]/Magick::QuantumRange)
72
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[0]/scale, channel_mean(Magick::BlackChannel)[0]/Magick::QuantumRange)
73
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[1]/scale, channel_mean(Magick::BlackChannel)[1]/Magick::QuantumRange)
74
+ when Magick::GrayColorspace
75
+ puts "\t\tGray:\n"
76
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[0]/scale, channel_extrema(Magick::GrayChannel)[0]/Magick::QuantumRange)
77
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[1]/scale, channel_extrema(Magick::GrayChannel)[1]/Magick::QuantumRange)
78
+ puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[0]/scale, channel_mean(Magick::GrayChannel)[0]/Magick::QuantumRange)
79
+ puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[1]/scale, channel_mean(Magick::GrayChannel)[1]/Magick::QuantumRange)
80
+ end
81
+ if matte
82
+ puts "\t\tOpacity:\n"
83
+ puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[0]/scale, channel_extrema(Magick::OpacityChannel)[0]/Magick::QuantumRange)
84
+ puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[1]/scale, channel_extrema(Magick::OpacityChannel)[1]/Magick::QuantumRange)
85
+ puts "\t\t\tMean:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[0]/scale, channel_mean(Magick::OpacityChannel)[0]/Magick::QuantumRange)
86
+ puts "\t\t\tStandard deviation:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[1]/scale, channel_mean(Magick::OpacityChannel)[1]/Magick::QuantumRange)
87
+ end
88
+ if class_type == Magick::DirectClass
89
+ puts "\tColors: #{total_colors}\n"
90
+ else
91
+ if total_colors <= colors
92
+ puts "\tColors: #{colors}\n"
93
+ else
94
+ puts "\tColors: #{total_colors}=>#{colors}\n"
95
+ end
96
+ end
97
+ # Histogram goes here
98
+ puts "\tMean error per pixel: #{mean_error_per_pixel}\n" if mean_error_per_pixel != 0.0
99
+ puts "\tNormalized mean error: #{normalized_mean_error}\n" if normalized_mean_error != 0.0
100
+ puts "\tNormalized maximum error: #{normalized_maximum_error}\n" if normalized_maximum_error != 0.0
101
+ puts "\tRendering-intent: #{rendering_intent}\n"
102
+ puts "\tGamma: #{gamma}\n" if gamma != 0.0
103
+ chrom = chromaticity
104
+ if chrom.red_primary.x != 0.0 || chrom.green_primary.x != 0.0 || chrom.blue_primary.x != 0.0 || chrom.white_point.x != 0.0
105
+ puts "\tChromaticity:\n"
106
+ puts "\t\tred primary: (#{sprintf('%g,%g', chrom.red_primary.x, chrom.red_primary.y)})\n"
107
+ puts "\t\tgreen primary: (#{sprintf('%g,%g', chrom.green_primary.x, chrom.green_primary.y)})\n"
108
+ puts "\t\tblue primary: (#{sprintf('%g,%g', chrom.blue_primary.x, chrom.blue_primary.y)})\n"
109
+ puts "\t\twhite point: (#{sprintf('%g,%g', chrom.white_point.x, chrom.white_point.y)})\n"
110
+ end
111
+ ex_info = extract_info
112
+ if ex_info.width * ex_info.height != 0.0
113
+ puts "\tTile geometry: #{ex_info.width}x#{ex_info.height}+#{ex_info.x}+#{ex_info.y}\n"
114
+ end
115
+ if x_resolution != 0.0 && y_resolution != 0.0
116
+ puts "\tResolution: #{sprintf('%gx%g', x_resolution, y_resolution)}\n"
117
+ end
118
+ puts "\tUnits: #{units}\n"
119
+ size = filesize
120
+ if size >= 1048576
121
+ puts "\tFilesize: #{'%.1f' % (size/1048576.0)}mb\n"
122
+ elsif size >= 1024
123
+ puts "\tFilesize: #{'%.0f' % (size/1024.0)}kb\n"
124
+ else
125
+ puts "\tFilesize: #{size}b\n"
126
+ end
127
+ puts "\tInterlace: #{interlace}\n"
128
+ puts "\tBackground Color: #{background_color}\n"
129
+ puts "\tBorder Color: #{border_color}\n"
130
+ puts "\tMatte Color: #{matte_color}\n"
131
+ pg = page
132
+ if pg.width != 0 || pg.height != 0 || pg.x != 0 || pg.y != 0
133
+ puts "\tPage geometry: #{pg.width}x#{pg.height}+#{pg.x}+#{pg.y}\n"
134
+ end
135
+ puts "\tDispose: #{dispose}\n"
136
+ puts "\tDelay: #{delay}\n" if delay != 0
137
+ puts "\tIterations: #{iterations}\n" unless iterations == 1
138
+ puts "\tScene: #{scene}\n" if scene != 0
139
+ puts "\tCompression: #{compression}\n"
140
+ puts "\tQuality: #{quality}\n" unless quality == 0
141
+ puts "\tOrientation: #{orientation}\n"
142
+ puts "\tMontage: #{montage}\n" if montage
143
+ signature # compute but ignore - will be displayed along with the other properties
144
+ properties.each do |prop, value|
145
+ next if prop[0,1] == '['
146
+ puts "\t#{prop}: #{value}\n"
147
+ end
148
+ clip_path = self['8BIM:1999,2998:#1']
149
+ if clip_path
150
+ puts "\tClipping path: #{clip_path}\n"
151
+ end
152
+ each_profile do |name, value|
153
+ puts "\tProfile-#{name}: #{value.length}\n"
154
+ if name == 'exif'
155
+ exif_attrs = get_exif_by_entry
156
+ exif_attrs.each do |attr|
157
+ puts "\t\t#{attr[0]}: #{attr[1]}\n"
158
+ end
159
+ end
160
+ end
161
+ puts "\tTainted: True\n" if changed?
162
+ puts "\tTainted: False\n" unless changed?
163
+ puts "\tVersion: #{Magick::Version}\n"
164
+ puts "\t #{Magick::Magick_version}\n"
165
+ end
166
+ end
167
+ end
168
+
169
+ if ARGV.length == 0
170
+ puts <<-'END_USAGE'
171
+ This example displays information about the specified image file(s)
172
+ that is similar to ImageMagick/GraphicsMagick's identify command.
173
+
174
+ Usage:
175
+ ruby identify.rb filename [filename...]
176
+ END_USAGE
177
+ exit
178
+ end
179
+
180
+ ilist = Magick::ImageList.new(*ARGV)
181
+ ilist.each do |img|
182
+ img.identify
183
+ end
184
+
185
+ exit