Class: Pxlsrt::Smart
- Inherits:
-
Object
- Object
- Pxlsrt::Smart
- Defined in:
- lib/pxlsrt/smart.rb
Overview
Smart sorting uses sorted-finding algorithms to create bands to sort, as opposed to brute sorting which doesn’t care for the content or sorteds, just a specified range to create bands.
Class Method Summary collapse
-
.smart(input, o = {}) ⇒ Object
The main attraction of the Smart class.
-
.suite(inputFileName, outputFileName, o = {}) ⇒ Object
Uses Pxlsrt::Smart.smart to input and output from pne method.
Class Method Details
.smart(input, o = {}) ⇒ Object
The main attraction of the Smart class. Returns a ChunkyPNG::Image that is sorted according to the options provided. Will raise any error that occurs.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# File 'lib/pxlsrt/smart.rb', line 19 def self.smart(input, o={}) startTime=Time.now defOptions={ :reverse => false, :vertical => false, :diagonal => false, :smooth => false, :method => "sum-rgb", :verbose => false, :absolute => false, :threshold => 20, :trusted => false, :middle => false } defRules={ :reverse => :anything, :vertical => [false, true], :diagonal => [false, true], :smooth => [false, true], :method => Pxlsrt::Colors::METHODS, :verbose => [false, true], :absolute => [false, true], :threshold => [{:class => [Float, Fixnum]}], :trusted => [false, true], :middle => :anything } =defOptions.merge(o) if o.length==0 or [:trusted]==true or ([:trusted]==false and o.length!=0 and Pxlsrt::Helpers.checkOptions(, defRules)!=false) Pxlsrt::Helpers.verbose("Options are all good.") if [:verbose] if input.class==String Pxlsrt::Helpers.verbose("Getting image from file...") if [:verbose] if File.file?(input) if Pxlsrt::Colors.isPNG?(input) input=ChunkyPNG::Image.from_file(input) else Pxlsrt::Helpers.error("File #{input} is not a valid PNG.") if [:verbose] raise "Invalid PNG" end else Pxlsrt::Helpers.error("File #{input} doesn't exist!") if [:verbose] raise "File doesn't exist" end elsif input.class!=String and input.class!=ChunkyPNG::Image Pxlsrt::Helpers.error("Input is not a filename or ChunkyPNG::Image") if [:verbose] raise "Invalid input (must be filename or ChunkyPNG::Image)" end Pxlsrt::Helpers.verbose("Smart mode.") if [:verbose] png=Pxlsrt::Image.new(input) if ![:vertical] and ![:diagonal] Pxlsrt::Helpers.verbose("Retrieving rows") if [:verbose] lines = png.horizontalLines elsif [:vertical] and ![:diagonal] Pxlsrt::Helpers.verbose("Retrieving columns") if [:verbose] lines = png.verticalLines elsif ![:vertical] and [:diagonal] Pxlsrt::Helpers.verbose("Retrieving diagonals") if [:verbose] lines = png.diagonalLines elsif [:vertical] and [:diagonal] Pxlsrt::Helpers.verbose("Retrieving diagonals") if [:verbose] lines = png.rDiagonalLines end Pxlsrt::Helpers.verbose("Retrieving edges") if [:verbose] png.getSobels if ![:diagonal] iterator = 0...(lines.length) else iterator = lines.keys end prr = 0 len = iterator.to_a.length Pxlsrt::Helpers.progress("Dividing and pixel sorting lines", prr, len) if [:verbose] for k in iterator line = lines[k] divisions = [] division = [] if line.length > 1 for pixel in 0...(line.length) if ![:vertical] and ![:diagonal] xy = png.horizontalXY(k, pixel) elsif [:vertical] and ![:diagonal] xy = png.verticalXY(k, pixel) elsif ![:vertical] and [:diagonal] xy = png.diagonalXY(k, pixel) elsif [:vertical] and [:diagonal] xy = png.rDiagonalXY(k, pixel) end pxlSobel = png.getSobelAndColor(xy["x"], xy["y"]) if division.length == 0 or ([:absolute] ? pxlSobel["sobel"] : pxlSobel["sobel"] - division.last["sobel"]) <= [:threshold] division.push(pxlSobel) else divisions.push(division) division = [pxlSobel] end if pixel == line.length - 1 divisions.push(division) division = [] end end end newLine = [] for band in divisions newLine.concat( Pxlsrt::Helpers.handlePixelSort( band.map { |sobelAndColor| sobelAndColor["color"] }, ) ) end if ![:diagonal] png.replaceHorizontal(k, newLine) if ![:vertical] png.replaceVertical(k, newLine) if [:vertical] else png.replaceDiagonal(k, newLine) if ![:vertical] png.replaceRDiagonal(k, newLine) if [:vertical] end prr += 1 Pxlsrt::Helpers.progress("Dividing and pixel sorting lines", prr, len) if [:verbose] end endTime=Time.now timeElapsed=endTime-startTime if timeElapsed < 60 Pxlsrt::Helpers.verbose("Took #{timeElapsed.round(4)} second#{ timeElapsed.round(4)!=1.0 ? "s" : "" }.") if [:verbose] else minutes=(timeElapsed/60).floor seconds=(timeElapsed % 60).round(4) Pxlsrt::Helpers.verbose("Took #{minutes} minute#{ minutes!=1 ? "s" : "" } and #{seconds} second#{ seconds!=1.0 ? "s" : "" }.") if [:verbose] end Pxlsrt::Helpers.verbose("Returning ChunkyPNG::Image...") if [:verbose] return png.returnModified else Pxlsrt::Helpers.error("Options specified do not follow the correct format.") if [:verbose] raise "Bad options" end end |
.suite(inputFileName, outputFileName, o = {}) ⇒ Object
Uses Pxlsrt::Smart.smart to input and output from pne method.
11 12 13 14 15 16 |
# File 'lib/pxlsrt/smart.rb', line 11 def self.suite(inputFileName, outputFileName, o={}) kml=Pxlsrt::Smart.smart(inputFileName, o) if Pxlsrt::Helpers.contented(kml) kml.save(outputFileName) end end |