index.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. const path = require("path");
  2. const fs = require("fs");
  3. const gm = require("gm").subClass({ imageMagick: true });
  4. const queue = require("queue");
  5. const q = queue({ results: [], concurrency: 16 });
  6. let main = {
  7. list: [],
  8. imgsrc: "",
  9. basePath: "/Users/drew/Downloads/未命名文件夹",
  10. total: 0,
  11. now: 0,
  12. max: 5000,
  13. type: 0,
  14. backName(list) {
  15. return [...list].map((item) => {
  16. return item.name;
  17. });
  18. },
  19. setList(name, list = [], keyIndex = 0, keyLength = 1) {
  20. let names = name.split("_");
  21. let num = Math.ceil((Number(names[2]) * this.max) / 100);
  22. for (let i = 0; i < num; i++) {
  23. let index = this.getIndex(list, keyIndex, keyLength);
  24. list[index][keyIndex] = name;
  25. }
  26. return list;
  27. },
  28. getIndex(list, keyIndex, keyLength) {
  29. let index = this.getRandom(0, this.max - 1);
  30. if (!list[index]) {
  31. list[index] = new Array(keyLength);
  32. }
  33. if (list[index][keyIndex]) {
  34. return this.getIndex(list, keyIndex, keyLength);
  35. } else {
  36. return index;
  37. }
  38. },
  39. drawEnter() {
  40. if (!fs.existsSync(path.resolve(this.basePath, "images"))) {
  41. fs.mkdirSync(path.resolve(this.basePath, "images"));
  42. }
  43. let fileList = fs.readdirSync(this.basePath).filter((i) => {
  44. return !i.startsWith(".") && i.endsWith(".png");
  45. });
  46. let _map = new Map();
  47. fileList.forEach((item) => {
  48. let names = item.split("_");
  49. let _list = this.type ? [[], []] : [];
  50. if (_map.has(names[1])) {
  51. _list = _map.get(names[1]);
  52. }
  53. if (this.type) {
  54. if (Number(names[2]) > 0) {
  55. _list[1].push(item);
  56. } else {
  57. _list[0].push(item);
  58. }
  59. } else {
  60. _list.push(item);
  61. }
  62. _map.set(names[1], _list);
  63. });
  64. if (this.type) {
  65. this.drawType2(_map);
  66. } else {
  67. this.drawType1(_map);
  68. }
  69. },
  70. drawType2(_map) {
  71. const allkeys = [..._map.keys()].sort((a, b) => {
  72. return Number(a) - Number(b);
  73. });
  74. let list1 = allkeys.map((item) => {
  75. return _map.get(item)[0];
  76. });
  77. let list2 = allkeys.map((item) => {
  78. return _map.get(item)[1];
  79. });
  80. let allList = new Array(this.max);
  81. list2.forEach((_list, index) => {
  82. _list.forEach((item) => {
  83. allList = this.setList(item, allList, index, allkeys.length);
  84. });
  85. });
  86. for (let i = 0; i < allList.length; i++) {
  87. let _list1 = allList[i] || new Array(allkeys.length);
  88. list1.forEach((_list, index) => {
  89. if (!_list1[index]) {
  90. if (_list.length !== 0) {
  91. _list1[index] =
  92. _list[this.getRandom(0, _list.length - 1)];
  93. } else {
  94. _list1[index] =
  95. list2[index][
  96. this.getRandom(0, list2[index].length - 1)
  97. ];
  98. }
  99. }
  100. });
  101. }
  102. this.total = allList.length;
  103. this.startDraw(allList);
  104. },
  105. drawType1(_map) {
  106. [..._map.keys()].forEach((_key) => {
  107. let _list = _map.get(_key);
  108. let _radios2 = [];
  109. let _radios = _list.map((item) => {
  110. let names = item.split("_");
  111. let num = Number(names[2]);
  112. if (num > 0) {
  113. _radios2.push(num);
  114. }
  115. return num;
  116. });
  117. let allNums = _radios2.reduce((pre, cur) => {
  118. return pre + cur;
  119. }, 0);
  120. let before = 0;
  121. let _num = [];
  122. let _listMap = new Map();
  123. _radios.forEach((item, index) => {
  124. let __num = before;
  125. if (item > 0) {
  126. __num += item;
  127. } else {
  128. __num += Math.ceil(
  129. (100 - allNums) / (_radios.length - _radios2.length)
  130. );
  131. }
  132. before = __num;
  133. _num.push(__num);
  134. _listMap.set(_list[index], __num);
  135. });
  136. _map.set(_key, _listMap);
  137. });
  138. let allList = [..._map.keys()]
  139. .sort((a, b) => {
  140. return Number(a) - Number(b);
  141. })
  142. .map((_key) => {
  143. return _map.get(_key);
  144. });
  145. let totalList = [];
  146. for (let i = 0; i < this.max; i++) {
  147. let _list = [];
  148. let rs = [];
  149. allList.forEach((_vals) => {
  150. let vals = [..._vals.values()];
  151. let r = this.getRandom(1, vals[vals.length - 1]);
  152. let index = vals.findIndex((item) => {
  153. return r <= item;
  154. });
  155. rs.push(r);
  156. _list.push([..._vals.keys()][index]);
  157. });
  158. totalList.push(_list);
  159. }
  160. this.startDraw(totalList);
  161. },
  162. startDraw(list) {
  163. let c = 0;
  164. for (let imgs of list) {
  165. q.push((cb) => {
  166. let t = new Date().getTime();
  167. let name =
  168. imgs
  169. .map((item) => {
  170. let infos = item.replace(/.png/, "").split("_");
  171. return infos[infos.length - 1];
  172. })
  173. .join("_") + ".png";
  174. let g = gm();
  175. for (let img of imgs) {
  176. g = g.in(path.resolve(this.basePath, img));
  177. }
  178. g.mosaic().write(
  179. path.resolve(this.basePath, "images", name),
  180. function (err) {
  181. if (err) {
  182. console.log(err);
  183. }
  184. console.log(
  185. ++c +
  186. " done in " +
  187. (new Date().getTime() - t) +
  188. "ms"
  189. );
  190. cb();
  191. }
  192. );
  193. });
  194. }
  195. },
  196. getRandom(m = 1, n = 100) {
  197. return Math.round(Math.random() * (n - m) + m);
  198. },
  199. };
  200. main.drawEnter();
  201. let t = new Date().getTime();
  202. q.start(function (err) {
  203. if (err) throw err;
  204. console.log(
  205. "all done in " + parseInt((new Date().getTime() - t) / 1000) + "s"
  206. );
  207. });