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 return nil if it encounters an errors.
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 |
# File 'lib/pxlsrt/smart.rb', line 20 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 => ["sum-rgb", "red", "green", "blue", "sum-hsb", "hue", "saturation", "brightness", "uniqueness", "luma", "random", "cyan", "magenta", "yellow", "alpha", "sum-rgba", "sum-hsba"], :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] return end else Pxlsrt::Helpers.error("File #{input} doesn't exist!") if [:verbose] return end elsif input.class!=String and input.class!=ChunkyPNG::Image Pxlsrt::Helpers.error("Input is not a filename or ChunkyPNG::Image") if [:verbose] return 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 Pxlsrt::Helpers.verbose("Dividing and pixel sorting lines") 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 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] return end end |
.suite(inputFileName, outputFileName, o = {}) ⇒ Object
Uses Pxlsrt::Smart.smart to input and output from pne method.
12 13 14 15 16 17 |
# File 'lib/pxlsrt/smart.rb', line 12 def self.suite(inputFileName, outputFileName, o={}) kml=Pxlsrt::Smart.smart(inputFileName, o) if Pxlsrt::Helpers.contented(kml) kml.save(outputFileName) end end |