skins.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. var logging = require("./logging");
  2. var lwip = require("lwip");
  3. var fs = require("fs");
  4. var exp = {};
  5. // extracts the face from an image +buffer+
  6. // result is saved to a file called +outname+
  7. // +callback+ contains error
  8. exp.extract_face = function(buffer, outname, callback) {
  9. lwip.open(buffer, "png", function(err, image) {
  10. if (err) {
  11. callback(err);
  12. } else {
  13. image.batch()
  14. .crop(8, 8, 15, 15) // face
  15. .writeFile(outname, function(err) {
  16. if (err) {
  17. callback(err);
  18. } else {
  19. callback(null);
  20. }
  21. });
  22. }
  23. });
  24. };
  25. // extracts the helm from an image +buffer+ and lays it over a +facefile+
  26. // +facefile+ is the filename of an image produced by extract_face
  27. // result is saved to a file called +outname+
  28. // +callback+ contains error
  29. exp.extract_helm = function(rid, facefile, buffer, outname, callback) {
  30. lwip.open(buffer, "png", function(err, skin_img) {
  31. if (err) {
  32. callback(err);
  33. } else {
  34. lwip.open(facefile, function(err, face_img) {
  35. if (err) {
  36. callback(err);
  37. } else {
  38. face_img.toBuffer("png", { compression: "none" }, function(err, face_buffer) {
  39. skin_img.crop(40, 8, 47, 15, function(err, helm_img) {
  40. if (err) {
  41. callback(err);
  42. } else {
  43. face_img.paste(0, 0, helm_img, function(err, face_helm_img) {
  44. if (err) {
  45. callback(err);
  46. } else {
  47. face_helm_img.toBuffer("png", {compression: "none"}, function(err, face_helm_buffer) {
  48. if (face_helm_buffer.toString() !== face_buffer.toString()) {
  49. face_helm_img.writeFile(outname, function(err) {
  50. callback(err);
  51. });
  52. } else {
  53. logging.log(rid + "helm img == face img, not storing!");
  54. callback(null);
  55. }
  56. });
  57. }
  58. });
  59. }
  60. });
  61. });
  62. }
  63. });
  64. }
  65. });
  66. };
  67. // resizes the image file +inname+ to +size+ by +size+ pixels
  68. // +callback+ contains error, image buffer
  69. exp.resize_img = function(inname, size, callback) {
  70. lwip.open(inname, function(err, image) {
  71. if (err) {
  72. callback(err, null);
  73. } else {
  74. image.batch()
  75. .resize(size, size, "nearest-neighbor") // nearest-neighbor doesn't blur
  76. .toBuffer("png", function(err, buffer) {
  77. callback(null, buffer);
  78. });
  79. }
  80. });
  81. };
  82. // returns "alex" or "steve" calculated by the +userId+
  83. exp.default_skin = function(userId) {
  84. if (Number("0x" + userId[31]) % 2 === 0) {
  85. return "alex";
  86. } else {
  87. return "steve";
  88. }
  89. };
  90. // helper method for opening a skin file from +skinpath+
  91. // callback contains error, image buffer
  92. exp.open_skin = function(rid, skinpath, callback) {
  93. fs.readFile(skinpath, function(err, buf) {
  94. if (err) {
  95. logging.error(rid + "error while opening skin file: " + err);
  96. callback(err, null);
  97. } else {
  98. callback(null, buf);
  99. }
  100. });
  101. };
  102. exp.save_image = function(buffer, outpath, callback) {
  103. lwip.open(buffer, "png", function(err, image) {
  104. if (err) {
  105. callback(err);
  106. } else {
  107. image.batch()
  108. .writeFile(outpath, function(err) {
  109. if (err) {
  110. callback(err);
  111. } else {
  112. callback(null);
  113. }
  114. });
  115. }
  116. });
  117. };
  118. module.exports = exp;