| Class | Magick::ImageList |
| In: |
lib/RMagick.rb
|
| Parent: | Object |
| length | -> | size |
| remap | -> | affinity |
| ImageMagic used affinity in 6.4.3, switch to remap in 6.4.4. | ||
| respond_to? | -> | __respond_to__? |
| Ensure respond_to? answers correctly when we are delegating to Image | ||
| scene | [R] |
Initialize new instances
# File lib/RMagick.rb, line 1634
1634: def initialize(*filenames, &block)
1635: @images = []
1636: @scene = nil
1637: filenames.each { |f|
1638: Magick::Image.read(f, &block).each { |n| @images << n }
1639: }
1640: if length > 0
1641: @scene = length - 1 # last image in array
1642: end
1643: self
1644: end
# File lib/RMagick.rb, line 1392
1392: def *(n)
1393: unless n.kind_of? Integer
1394: Kernel.raise ArgumentError, "Integer required (#{n.class} given)"
1395: end
1396: current = get_current()
1397: ilist = self.class.new
1398: (@images * n).each {|image| ilist << image}
1399: ilist.set_current current
1400: return ilist
1401: end
# File lib/RMagick.rb, line 1403
1403: def <<(obj)
1404: is_an_image obj
1405: @images << obj
1406: @scene = @images.length - 1
1407: self
1408: end
Compare ImageLists Compare each image in turn until the result of a comparison is not 0. If all comparisons return 0, then
return if A.scene != B.scene return A.length <=> B.length
# File lib/RMagick.rb, line 1415
1415: def <=>(other)
1416: unless other.kind_of? self.class
1417: Kernel.raise TypeError, "#{self.class} required (#{other.class} given)"
1418: end
1419: size = [self.length, other.length].min
1420: size.times do |x|
1421: r = self[x] <=> other[x]
1422: return r unless r == 0
1423: end
1424: if @scene.nil? && other.scene.nil?
1425: return 0
1426: elsif @scene.nil? && ! other.scene.nil?
1427: Kernel.raise TypeError, "cannot convert nil into #{other.scene.class}"
1428: elsif ! @scene.nil? && other.scene.nil?
1429: Kernel.raise TypeError, "cannot convert nil into #{self.scene.class}"
1430: end
1431: r = self.scene <=> other.scene
1432: return r unless r == 0
1433: return self.length <=> other.length
1434: end
# File lib/RMagick.rb, line 1436
1436: def [](*args)
1437: a = @images[*args]
1438: if a.respond_to?(:each) then
1439: ilist = self.class.new
1440: a.each {|image| ilist << image}
1441: a = ilist
1442: end
1443: return a
1444: end
# File lib/RMagick.rb, line 1446
1446: def []=(*args)
1447: obj = @images.[]=(*args)
1448: if obj && obj.respond_to?(:each) then
1449: is_an_image_array(obj)
1450: set_current obj.last.__id__
1451: elsif obj
1452: is_an_image(obj)
1453: set_current obj.__id__
1454: else
1455: set_current nil
1456: end
1457: return obj
1458: end
# File lib/RMagick.rb, line 1483
1483: def clone
1484: ditto = dup
1485: ditto.freeze if frozen?
1486: return ditto
1487: end
override Enumerable#collect
# File lib/RMagick.rb, line 1490
1490: def collect(&block)
1491: current = get_current()
1492: a = @images.collect(&block)
1493: ilist = self.class.new
1494: a.each {|image| ilist << image}
1495: ilist.set_current current
1496: return ilist
1497: end
# File lib/RMagick.rb, line 1499
1499: def collect!(&block)
1500: @images.collect!(&block)
1501: is_an_image_array @images
1502: self
1503: end
# File lib/RMagick.rb, line 1530
1530: def compact
1531: current = get_current()
1532: ilist = self.class.new
1533: a = @images.compact
1534: a.each {|image| ilist << image}
1535: ilist.set_current current
1536: return ilist
1537: end
# File lib/RMagick.rb, line 1539
1539: def compact!
1540: current = get_current()
1541: a = @images.compact! # returns nil if no changes were made
1542: set_current current
1543: return a.nil? ? nil : self
1544: end
# File lib/RMagick.rb, line 1546
1546: def concat(other)
1547: is_an_image_array other
1548: other.each {|image| @images << image}
1549: @scene = length-1
1550: return self
1551: end
Return the current image
# File lib/RMagick.rb, line 1515
1515: def cur_image
1516: if ! @scene
1517: Kernel.raise IndexError, "no images in this list"
1518: end
1519: @images[@scene]
1520: end
Set same delay for all images
# File lib/RMagick.rb, line 1554
1554: def delay=(d)
1555: if Integer(d) < 0
1556: raise ArgumentError, "delay must be greater than or equal to 0"
1557: end
1558: @images.each { |f| f.delay = Integer(d) }
1559: end
# File lib/RMagick.rb, line 1561
1561: def delete(obj, &block)
1562: is_an_image obj
1563: current = get_current()
1564: a = @images.delete(obj, &block)
1565: set_current current
1566: return a
1567: end
# File lib/RMagick.rb, line 1569
1569: def delete_at(ndx)
1570: current = get_current()
1571: a = @images.delete_at(ndx)
1572: set_current current
1573: return a
1574: end
# File lib/RMagick.rb, line 1576
1576: def delete_if(&block)
1577: current = get_current()
1578: @images.delete_if(&block)
1579: set_current current
1580: self
1581: end
# File lib/RMagick.rb, line 1583
1583: def dup
1584: ditto = self.class.new
1585: @images.each {|img| ditto << img}
1586: ditto.scene = @scene
1587: ditto.taint if tainted?
1588: return ditto
1589: end
# File lib/RMagick.rb, line 1591
1591: def eql?(other)
1592: is_an_image_array other
1593: eql = other.eql?(@images)
1594: begin # "other" is another ImageList
1595: eql &&= @scene == other.scene
1596: rescue NoMethodError
1597: # "other" is a plain Array
1598: end
1599: return eql
1600: end
# File lib/RMagick.rb, line 1602
1602: def fill(*args, &block)
1603: is_an_image args[0] unless block_given?
1604: current = get_current()
1605: @images.fill(*args, &block)
1606: is_an_image_array self
1607: set_current current
1608: self
1609: end
# File lib/RMagick.rb, line 1622
1622: def from_blob(*blobs, &block)
1623: if (blobs.length == 0)
1624: Kernel.raise ArgumentError, "no blobs given"
1625: end
1626: blobs.each { |b|
1627: Magick::Image.from_blob(b, &block).each { |n| @images << n }
1628: }
1629: @scene = length - 1
1630: self
1631: end
# File lib/RMagick.rb, line 1646
1646: def insert(index, *args)
1647: args.each {|image| is_an_image image}
1648: current = get_current()
1649: @images.insert(index, *args)
1650: set_current current
1651: return self
1652: end
Set the number of iterations of an animated GIF
# File lib/RMagick.rb, line 1662
1662: def iterations=(n)
1663: n = Integer(n)
1664: if n < 0 || n > 65535
1665: Kernel.raise ArgumentError, "iterations must be between 0 and 65535"
1666: end
1667: @images.each {|f| f.iterations=n}
1668: self
1669: end
# File lib/RMagick.rb, line 1671
1671: def last(*args)
1672: if args.length == 0
1673: a = @images.last
1674: else
1675: a = @images.last(*args)
1676: ilist = self.class.new
1677: a.each {|img| ilist << img}
1678: @scene = a.length - 1
1679: a = ilist
1680: end
1681: return a
1682: end
Custom marshal/unmarshal for Ruby 1.8.
# File lib/RMagick.rb, line 1685
1685: def marshal_dump()
1686: ary = [@scene]
1687: @images.each {|i| ary << Marshal.dump(i)}
1688: ary
1689: end
# File lib/RMagick.rb, line 1691
1691: def marshal_load(ary)
1692: @scene = ary.shift
1693: @images = []
1694: ary.each {|a| @images << Marshal.load(a)}
1695: end
The ImageList class supports the Magick::Image class methods by simply sending the method to the current image. If the method isn‘t explicitly supported, send it to the current image in the array. If there are no images, send it up the line. Catch a NameError and emit a useful message.
# File lib/RMagick.rb, line 1701
1701: def method_missing(methID, *args, &block)
1702: begin
1703: if @scene
1704: @images[@scene].send(methID, *args, &block)
1705: else
1706: super
1707: end
1708: rescue NoMethodError
1709: Kernel.raise NoMethodError, "undefined method `#{methID.id2name}' for #{self.class}"
1710: rescue Exception
1711: $@.delete_if { |s| /:in `send'$/.match(s) || /:in `method_missing'$/.match(s) }
1712: Kernel.raise
1713: end
1714: end
# File lib/RMagick.rb, line 1721
1721: def partition(&block)
1722: a = @images.partition(&block)
1723: t = self.class.new
1724: a[0].each { |img| t << img}
1725: t.set_current nil
1726: f = self.class.new
1727: a[1].each { |img| f << img}
1728: f.set_current nil
1729: [t, f]
1730: end
Ping files and concatenate the new images
# File lib/RMagick.rb, line 1733
1733: def ping(*files, &block)
1734: if (files.length == 0)
1735: Kernel.raise ArgumentError, "no files given"
1736: end
1737: files.each { |f|
1738: Magick::Image.ping(f, &block).each { |n| @images << n }
1739: }
1740: @scene = length - 1
1741: self
1742: end
# File lib/RMagick.rb, line 1744
1744: def pop
1745: current = get_current()
1746: a = @images.pop # can return nil
1747: set_current current
1748: return a
1749: end
# File lib/RMagick.rb, line 1751
1751: def push(*objs)
1752: objs.each do |image|
1753: is_an_image image
1754: @images << image
1755: end
1756: @scene = length - 1
1757: self
1758: end
Read files and concatenate the new images
# File lib/RMagick.rb, line 1761
1761: def read(*files, &block)
1762: if (files.length == 0)
1763: Kernel.raise ArgumentError, "no files given"
1764: end
1765: files.each { |f|
1766: Magick::Image.read(f, &block).each { |n| @images << n }
1767: }
1768: @scene = length - 1
1769: self
1770: end
# File lib/RMagick.rb, line 1782
1782: def reject!(&block)
1783: current = get_current()
1784: a = @images.reject!(&block)
1785: @images = a if !a.nil?
1786: set_current current
1787: return a.nil? ? nil : self
1788: end
# File lib/RMagick.rb, line 1790
1790: def replace(other)
1791: is_an_image_array other
1792: current = get_current()
1793: @images.clear
1794: other.each {|image| @images << image}
1795: @scene = self.length == 0 ? nil : 0
1796: set_current current
1797: self
1798: end
# File lib/RMagick.rb, line 1802
1802: def respond_to?(methID, priv=false)
1803: return true if __respond_to__?(methID, priv)
1804: if @scene
1805: @images[@scene].respond_to?(methID, priv)
1806: else
1807: super
1808: end
1809: end
# File lib/RMagick.rb, line 1811
1811: def reverse
1812: current = get_current()
1813: a = self.class.new
1814: @images.reverse_each {|image| a << image}
1815: a.set_current current
1816: return a
1817: end
# File lib/RMagick.rb, line 1819
1819: def reverse!
1820: current = get_current()
1821: @images.reverse!
1822: set_current current
1823: self
1824: end
# File lib/RMagick.rb, line 1826
1826: def reverse_each
1827: @images.reverse_each {|image| yield(image)}
1828: self
1829: end
Allow scene to be set to nil
# File lib/RMagick.rb, line 1352
1352: def scene=(n)
1353: if n.nil?
1354: Kernel.raise IndexError, "scene number out of bounds" unless @images.length == 0
1355: @scene = nil
1356: return @scene
1357: elsif @images.length == 0
1358: Kernel.raise IndexError, "scene number out of bounds"
1359: end
1360:
1361: n = Integer(n)
1362: if n < 0 || n > length - 1
1363: Kernel.raise IndexError, "scene number out of bounds"
1364: end
1365: @scene = n
1366: return @scene
1367: end
# File lib/RMagick.rb, line 1831
1831: def shift
1832: current = get_current()
1833: a = @images.shift
1834: set_current current
1835: return a
1836: end
# File lib/RMagick.rb, line 1838
1838: def slice(*args)
1839: current = get_current()
1840: slice = @images.slice(*args)
1841: if slice
1842: ilist = self.class.new
1843: if slice.respond_to?(:each) then
1844: slice.each {|image| ilist << image}
1845: else
1846: ilist << slice
1847: end
1848: else
1849: ilist = nil
1850: end
1851: return ilist
1852: end
# File lib/RMagick.rb, line 1854
1854: def slice!(*args)
1855: current = get_current()
1856: a = @images.slice!(*args)
1857: set_current current
1858: return a
1859: end
# File lib/RMagick.rb, line 1861
1861: def ticks_per_second=(t)
1862: if Integer(t) < 0
1863: Kernel.raise ArgumentError, "ticks_per_second must be greater than or equal to 0"
1864: end
1865: @images.each { |f| f.ticks_per_second = Integer(t) }
1866: end
# File lib/RMagick.rb, line 1868
1868: def to_a
1869: a = Array.new
1870: @images.each {|image| a << image}
1871: return a
1872: end
# File lib/RMagick.rb, line 1874
1874: def uniq
1875: current = get_current()
1876: a = self.class.new
1877: @images.uniq.each {|image| a << image}
1878: a.set_current current
1879: return a
1880: end
# File lib/RMagick.rb, line 1882
1882: def uniq!(*args)
1883: current = get_current()
1884: a = @images.uniq!
1885: set_current current
1886: return a.nil? ? nil : self
1887: end
# File lib/RMagick.rb, line 1897
1897: def values_at(*args)
1898: a = @images.values_at(*args)
1899: a = self.class.new
1900: @images.values_at(*args).each {|image| a << image}
1901: a.scene = a.length - 1
1902: return a
1903: end
# File lib/RMagick.rb, line 1309
1309: def is_an_image(obj)
1310: unless obj.kind_of? Magick::Image
1311: Kernel.raise ArgumentError, "Magick::Image required (#{obj.class} given)"
1312: end
1313: true
1314: end
Ensure array is always an array of Magick::Image objects
# File lib/RMagick.rb, line 1317
1317: def is_an_image_array(ary)
1318: unless ary.respond_to? :each
1319: Kernel.raise ArgumentError, "Magick::ImageList or array of Magick::Images required (#{ary.class} given)"
1320: end
1321: ary.each { |obj| is_an_image obj }
1322: true
1323: end
Find old current image, update scene number current is the id of the old current image.
# File lib/RMagick.rb, line 1327
1327: def set_current(current)
1328: if length() == 0
1329: self.scene = nil
1330: return
1331: # Don't bother looking for current image
1332: elsif scene() == nil || scene() >= length()
1333: self.scene = length() - 1
1334: return
1335: elsif current != nil
1336: # Find last instance of "current" in the list.
1337: # If "current" isn't in the list, set current to last image.
1338: self.scene = length() - 1
1339: each_with_index do |f,i|
1340: if f.__id__ == current
1341: self.scene = i
1342: end
1343: end
1344: return
1345: end
1346: self.scene = length() - 1
1347: end